如何構建線性回歸模型 - 機器學習示例_第1頁
如何構建線性回歸模型 - 機器學習示例_第2頁
如何構建線性回歸模型 - 機器學習示例_第3頁
如何構建線性回歸模型 - 機器學習示例_第4頁
如何構建線性回歸模型 - 機器學習示例_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

?在本教程中,您將學習如何構建線性回歸模型。這是您在學習機器學習時首先要做的事情之一,因此它將幫助您邁出進入這個競爭激烈的市場的第一步。???目錄目錄???先決條件什么是線性回歸?評估指標R平方均方根誤差線性回歸示例-汽車價格預測模型導入所需的包:導入數(shù)據(jù)集預處理數(shù)據(jù)集如何找到異常值分析數(shù)據(jù)集雙變量分析銷售價格與數(shù)字特征雙變量分析銷售價格與分類特征雙變量分析分類變量編碼相關性分析如何構建模型標準化數(shù)據(jù)集訓練模型如何評估模型使用K折交叉驗證評估模型結果可視化結論先決條件使用IDE(最好是VSCode)的中等水平經(jīng)驗對PythonNotebook(.pynb)文件的基本了解對Python編程語言有很好的理解Pandas(處理數(shù)據(jù)幀)、Numpy、ScikitLearn和Matplot庫的基本知識一些統(tǒng)計學知識有助于分析數(shù)據(jù)什么是線性回歸?線性回歸是一種監(jiān)督學習方法,其中預測輸出本質上是連續(xù)的。例如,價格預測、標記預測等。線性回歸是一種基本的統(tǒng)計和機器學習技術,用于對因變量(也稱為目標變量或響應變量)與一個或多個自變量(預測變量或特征)之間的關系進行建模。它的目的是建立一個最能代表這些變量之間關聯(lián)的線性方程,使我們能夠做出預測并從數(shù)據(jù)中得出見解。線性回歸的主要目標是找到“最佳擬合”線(或更高維度的超平面),以最小化預測值和實際觀測值之間的差異。這條最佳擬合線由以下形式的線性方程定義:Y=b0?+b1?X1?+b2?X2?+...+bn?Xn?在這個等式中:Y代表我們想要預測的因變量。X1,X2,...,Xn是自變量或特征。b0是截距(當所有X值均為零時Y的值)。b1,b2,...,bn是確定每個自變量和因變量之間關系的系數(shù)。線性回歸假設預測變量和目標變量之間存在線性關系。該模型的目標是估計系數(shù)(b0,b1,...,bn),以最小化訓練數(shù)據(jù)中預測值與實際值之間的平方差之和。此過程通常稱為“擬合模型”。評估指標線性回歸模型的評估指標是:決定系數(shù)或R平方(R2)均方根誤差(RSME)讓我們看看它們分別是什么。R平方R-Squared描述了開發(fā)模型捕獲的變化量。它始終介于0和1之間。R平方的值越高,模型與數(shù)據(jù)的擬合程度越好。均方根誤差RMSE測量模型生成的預測值與數(shù)據(jù)集中的實際觀測值之間的誤差或殘差的平均大小。它的范圍始終在0和正無窮大之間。RMSE值越低表明預測性能越好。線性回歸示例-汽車價格預測模型在此示例中,我們將嘗試通過構建線性回歸模型來預測汽車價格。我在Kaggle中發(fā)現(xiàn)了\o"這個問題"這個問題和數(shù)據(jù)集。我注意到有一個針對這個問題的\o"提交"提交,這是完美的。事實上,我通過采用該解決方案的一部分來構建我的解決方案。讓我們深入探討這個問題。我們得到了一個二手車數(shù)據(jù)集,其中包含汽車名稱、年份、售價、當前價格、行駛公里數(shù)、燃料類型、賣家類型、變速箱以及賣家是否是二手車所有者。我們的目標是預測汽車的售價。我們來探討一下解決方案。導入所需的包:您將需要各種軟件包來解決此問題。以下是導入它們的方法:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.linear_modelimportLinearRegressionfromsklearnimportmetricsfromsklearn.model_selectionimportKFoldfromsklearn.pipelineimportmake_pipelinefromstatsmodels.stats.diagnosticimportnormal_adfromstatsmodels.stats.outliers_influenceimportvariance_inflation_factorfromstatsmodels.stats.stattoolsimportdurbin_watsonfromscipyimportstats導入數(shù)據(jù)集

可以從我的\o"Github存儲庫"Github存儲庫下載。df=pd.read_csv('./cardata.csv')導入數(shù)據(jù)集預處理數(shù)據(jù)集下面的代碼顯示了列及其數(shù)據(jù)類型和行數(shù)。我們的數(shù)據(jù)集有9列和301行。()用于查找數(shù)據(jù)幀信息的命令,例如列、數(shù)據(jù)類型、行數(shù)等。

?“Car_Name”列描述汽車名稱。我們的數(shù)據(jù)集中應忽略該字段。這是因為,只有汽車的功能才重要,而不是它的名稱。以下代碼返回數(shù)據(jù)集中唯一汽車名稱的數(shù)量。df['Car_Name'].nunique()Car_Name查找列中唯一條目的數(shù)量我們的數(shù)據(jù)集中有98個獨特的汽車名稱。?唯一汽車名稱的數(shù)量顯然,它不會給我們的數(shù)據(jù)集添加任何意義,因為類別太多。讓我們刪除該列。df.drop('Car_Name',axis=1,inplace=True)刪除Car_Name列該數(shù)據(jù)集具有名為“Year”的列。理想情況下,我們需要購買/出售汽車的年份。因此,我們將其轉換為“年齡”并刪除“年份”列。df.insert(0,"Age",df["Year"].max()+1-df["Year"])df.drop('Year',axis=1,inplace=True)“車齡”是通過查找數(shù)據(jù)集中可用的最大年份與特定汽車年份之間的差異來計算的。這是因為,我們的計算將特定于該特定時間段和該數(shù)據(jù)集。?如何找到異常值異常值是與其他觀察值顯著不同的數(shù)據(jù)點。它們可能會導致模型的性能下降。?分類列的數(shù)據(jù)類型為“對象”。讓我們將數(shù)字列和分類列分組到NumPy數(shù)組中。數(shù)組中的前5個元素將是數(shù)字列,其余3個元素將是分類列。我們可以使用庫在列中繪制數(shù)據(jù)seaborn。分類列將包含多個條形,而數(shù)字列將包含單個條形。讓我們嘗試使用以下代碼查找數(shù)據(jù)集中的異常值:sns.set_style('darkgrid')colors=['#0055ff','#ff7000','#23bf00']CustomPalette=sns.set_palette(sns.color_palette(colors))OrderedCols=np.concatenate([df.select_dtypes(exclude='object').columns.values,df.select_dtypes(include='object').columns.values])fig,ax=plt.subplots(2,4,figsize=(15,7),dpi=100)fori,colinenumerate(OrderedCols):x=i//4y=i%4ifi<5:sns.boxplot(data=df,y=col,ax=ax[x,y])ax[x,y].yaxis.label.set_size(15)else:sns.boxplot(data=df,x=col,y='Selling_Price',ax=ax[x,y])ax[x,y].xaxis.label.set_size(15)ax[x,y].yaxis.label.set_size(15)plt.tight_layout()plt.show()用于查找每列中的異常值并將其繪制為圖表的代碼?數(shù)據(jù)集中的異常值確定讓我們嘗試使用四分位數(shù)范圍規(guī)則來查找異常值。這是基于四分位數(shù)的概念,將數(shù)據(jù)集分為四個相等的部分。IQR(四分位數(shù)范圍規(guī)則)規(guī)則特別關注數(shù)據(jù)中間50%內的值范圍,并使用該范圍來識別潛在的異常值。我們必須找到分類列中每個唯一值的最小和最大分位數(shù)值,并過濾掉不適合目標列(銷售價格)第25個和75個百分位的異常值樣本。另一方面,數(shù)值列中的異常值可以通過同一列的第25個和第75個百分位數(shù)進行過濾。我們不需要針對目標列進行過濾。outliers_indexes=[]target='Selling_Price'forcolindf.select_dtypes(include='object').columns:forcatindf[col].unique():df1=df[df[col]==cat]q1=df1[target].quantile(0.25)q3=df1[target].quantile(0.75)iqr=q3-q1maximum=q3+(1.5*iqr)minimum=q1-(1.5*iqr)outlier_samples=df1[(df1[target]<minimum)|(df1[target]>maximum)]outliers_indexes.extend(outlier_samples.index.tolist())forcolindf.select_dtypes(exclude='object').columns:q1=df[col].quantile(0.25)q3=df[col].quantile(0.75)iqr=q3-q1maximum=q3+(1.5*iqr)minimum=q1-(1.5*iqr)outlier_samples=df[(df[col]<minimum)|(df[col]>maximum)]outliers_indexes.extend(outlier_samples.index.tolist())outliers_indexes=list(set(outliers_indexes))print('{}outlierswereidentified,whoseindicesare:\n\n{}'.format(len(outliers_indexes),outliers_indexes))顯示檢測到的異常值的索引的代碼通過運行上面的代碼,我們發(fā)現(xiàn)數(shù)據(jù)集中有38個異常值。?但請記住,刪除異常值并不總是正確的決定。它們可以是合理的觀察結果,在決定是否丟棄異常值之前調查異常值的性質非常重要。我們可以在兩種情況下刪除異常值:異常值是由于錯誤輸入或測量的數(shù)據(jù)造成的異常值產(chǎn)生顯著關聯(lián)讓我們進一步挖掘并找到完美的異常值。為此,我們假設如果售價超過330萬盧比,或者汽車的行駛里程超過40萬公里,那么這些都是異常值。我們將它們標記為綠色。保存變量中的所有索引removing_indices。使用庫以散點圖格式繪制它們seaborn,將每列與我們的目標列進行比較。#OutliersLabelingdf1=df.copy()df1['label']='Normal'df1.loc[outliers_indexes,'label']='Outlier'#RemovingOutliersremoving_indexes=[]removing_indexes.extend(df1[df1[target]>33].index)removing_indexes.extend(df1[df1['Kms_Driven']>400000].index)df1.loc[removing_indexes,'label']='Removing'#Plottarget='Selling_Price'features=df.columns.drop(target)colors=['#0055ff','#ff7000','#23bf00']CustomPalette=sns.set_palette(sns.color_palette(colors))fig,ax=plt.subplots(nrows=3,ncols=3,figsize=(15,12),dpi=200)foriinrange(len(features)):x=i//3y=i%3sns.scatterplot(data=df1,x=features[i],y=target,hue='label',ax=ax[x,y])ax[x,y].set_title('{}vs.{}'.format(target,features[i]),size=15)ax[x,y].set_xlabel(features[i],size=12)ax[x,y].set_ylabel(target,size=12)ax[x,y].grid()ax[2,1].axis('off')ax[2,2].axis('off')plt.tight_layout()plt.show()用綠色繪制最佳異常值的代碼

?異常值用綠色標記讓我們看看完美的異常值:removing_indexes=list(set(removing_indexes))removing_indexes列出最佳異常值的代碼?原始異常值指數(shù)列表我們有2個。我們必須刪除它們。但在此之前,我們必須檢查數(shù)據(jù)集中是否存在空數(shù)據(jù)。df.isnull().sum()查找每列中空條目的數(shù)量我們的數(shù)據(jù)集中沒有空值。?數(shù)據(jù)集中沒有空值讓我們刪除已識別的異常值并重置數(shù)據(jù)幀的索引。df1=df.copy()df1.drop(removing_indexes,inplace=True)df1.reset_index(drop=True,inplace=True)從數(shù)據(jù)框中刪除異常值分析數(shù)據(jù)集讓我們分析一下數(shù)據(jù),看看每個字段/類別與汽車的售價有多少相關性。我們需要對我們的數(shù)據(jù)集進行一些分析才能得出一些結論。為此,我們必須識別數(shù)據(jù)集中的數(shù)值和分類字段,因為每種類型的繪制方法都不同。NumCols=['Age','Selling_Price','Present_Price','Kms_Driven','Owner']CatCols=['Fuel_Type','Seller_Type','Transmission']數(shù)字和分類列的列表雙變量分析如果您不熟悉什么是雙變量分析,\o"這里有一個基本定義"這里有一個基本定義:雙變量分析是最簡單的定量分析形式之一。它涉及對兩個變量的分析,以確定它們之間的經(jīng)驗關系。雙變量分析有助于檢驗簡單的關聯(lián)假設。讓我們使用雙變量分析將銷售價格與其他列進行比較,并嘗試從該數(shù)據(jù)中得出一些結論。銷售價格與數(shù)字特征雙變量分析讓我們使用雙變量分析將數(shù)值特征與銷售價格進行比較。數(shù)值列將繪制在散點圖中。fig,ax=plt.subplots(nrows=2,ncols=2,figsize=(10,10),dpi=90)num_features=['Present_Price','Kms_Driven','Age','Owner']target='Selling_Price'c='#0055ff'foriinrange(len(num_features)):row=i//2col=i%2ax[row,col].scatter(df1[num_features[i]],df1[target],color=c,edgecolors='w',linewidths=0.25)ax[row,col].set_title('{}vs.{}'.format(target,num_features[i]),size=12)ax[row,col].set_xlabel(num_features[i],size=12)ax[row,col].set_ylabel(target,size=12)ax[row,col].grid()plt.suptitle('SellingPricevs.NumericalFeatures',size=20)plt.tight_layout()plt.show()數(shù)值列與售價的比較

?銷售價格與數(shù)字特征雙變量分析銷售價格與分類特征雙變量分析讓我們使用雙變量分析將分類特征與銷售價格進行比較。分類列將繪制在帶狀圖中。這給出了類別中多個值之間的比較。fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(12,5),dpi=100)cat_features=['Fuel_Type','Seller_Type','Transmission']target='Selling_Price'c='#0055ff'foriinrange(len(cat_features)):sns.stripplot(ax=axes[i],x=cat_features[i],y=target,data=df1,size=6,color=c)axes[i].set_title('{}vs.{}'.format(target,cat_features[i]),size=13)axes[i].set_xlabel(cat_features[i],size=12)axes[i].set_ylabel(target,size=12)axes[i].grid()plt.suptitle('SellingPricevs.CategoricalFeatures',size=20)plt.tight_layout()plt.show()分類列與售價的比較

?銷售價格與分類特征雙變量分析以下是我們從數(shù)據(jù)分析中可以得出的結論:隨著現(xiàn)價上漲,售價也會上漲。它們是成正比的。銷售價格與行駛公里數(shù)成反比。售價與汽車的車齡成反比。隨著舊車擁有者數(shù)量的增加,其售價會下降。所以售價與所有者成反比。就售價而言,柴油車>CNG汽車>汽油車。個人銷售汽車的銷售價格低于經(jīng)銷商銷售汽車的價格。自動擋汽車比手動擋汽車貴。分類變量編碼我們不能按原樣使用分類字段。它們必須轉換為數(shù)字,因為機器只能理解數(shù)字。我們以“燃料”列為例。根據(jù)我們的數(shù)據(jù)集,我們的汽車使用兩種燃料。它們是汽油和柴油。分類變量編碼會將燃料列分為2列(Fuel_Type_Petrol和Fuel_Type_Diesel)。假設一輛汽車使用汽油。對于此汽車,數(shù)據(jù)將轉換為Fuel_Type_Petrol列設置為1(True),F(xiàn)uel_Type_Diesel列設置為0(False)。計算機可以理解1和0,而不是“汽油”和“柴油”。為此,我們將對分類列執(zhí)行one-hot編碼。Pandas提供了get_dummies對列進行編碼的方法。CatCols=['Fuel_Type','Seller_Type','Transmission']df1=pd.get_dummies(df1,columns=CatCols,drop_first=True)df1.head(5)對分類列進行One-Hot編碼

?分類變量編碼假設True和分別False是0和。1相關性分析相關矩陣是總結數(shù)據(jù)集中變量對之間線性關系的強度和方向的矩陣。它是統(tǒng)計和數(shù)據(jù)分析中的重要工具,用于檢查變量之間的關聯(lián)模式并了解它們如何相關。如果值為正,則相關性為正比;如果值為負,則相關性為反比。這是查找與銷售價格相關的相關矩陣的代碼。target='Selling_Price'cmap=sns.diverging_palette(125,28,s=100,l=65,sep=50,as_cmap=True)fig,ax=plt.subplots(figsize=(9,8),dpi=80)ax=sns.heatmap(pd.concat([df1.drop(target,axis=1),df1[target]],axis=1).corr(),annot=True,cmap=cmap)plt.show()繪制相關矩陣?相關矩陣從上面的矩陣中,我們可以推斷出目標變量“銷售價格”與當前價格、賣家類型和燃料類型高度相關。如何構建模型我們已經(jīng)到了最后階段。讓我們訓練和測試我們的模型。讓我們從輸入中刪除“Selling_Price”并將其設置為輸出。這意味著它必須被預測。X=df1.drop('Selling_Price',axis=1)y=df1['Selling_Price']將輸入和輸出(銷售價格)拆分為單獨的數(shù)據(jù)幀讓我們分割數(shù)據(jù)集,將70%的數(shù)據(jù)用于訓練,30%的數(shù)據(jù)用于測試。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)將原始數(shù)據(jù)集拆分為測試數(shù)據(jù)集和訓練數(shù)據(jù)集讓我們備份我們的測試數(shù)據(jù)。我們需要這個來進行最終比較。y_test_actual=y_test擁有原始輸出的副本標準化數(shù)據(jù)集這StandardScaler是機器學習和數(shù)據(jù)分析中常用的一種預處理技術,用于標準化或規(guī)范化數(shù)據(jù)集的特征(變量)。其主要目的是轉換數(shù)據(jù),使每個特征的平均值為0,標準差為1。讓我們使用標準化我們的數(shù)據(jù)集StandardScaler。scaler=StandardScaler()scaler.fit(X_train)X_train_scaled=scaler.transform(X_train)X_test_scaled=scaler.transform(X_test)標準化輸入數(shù)據(jù)集非常重要的是,StandardScaler變換只能從訓練集中獲得,否則會導致數(shù)據(jù)泄漏。訓練模型linear_reg=LinearRegression()linear_reg.fit(X_train_scaled,y_train)訓練模型讓我們找到訓練數(shù)據(jù)集中每列的截距和系數(shù)。pd.DataFrame(data=np.append(linear_ercept_,linear_reg.coef_),index=['Intercept']+[col+"Coef."forcolinX.columns],columns=['Value']).sort_values('Value',ascending=False)求斜率和截距?斜率和截距值如何評估模型ScikitLearn提供了指標功能,可以幫助我們衡量模型的指標。我們可以用它來確定指標,包括均方誤差、平均絕對誤差、均方根誤差和R2分數(shù)。現(xiàn)在是時候評估模型了:defmodel_evaluation(model,X_test,y_test,model_name):y_pred=model.predict(X_test)MAE=metrics.mean_absolute_error(y_test,y_pred)MSE=metrics.mean_squared_error(y_test,y_pred)RMSE=np.sqrt(MSE)R2_Score=metrics.r2_score(y_test,y_pred)returnpd.DataFrame([MAE,MSE,RMSE,R2_Score],index=['MAE','MSE','RMSE','R2-Score'],columns=[model_name])model_evaluation(linear_reg,X_test_scaled,y_test,'LinearReg.')模型評估?模型評估使用K折交叉驗證評估模型在k折交叉驗證中,數(shù)據(jù)集被分為k個大小大致相等的子集或“折疊”。該模型被訓練和評估k次,每次使用不同的折疊作為驗證集,剩余的折疊作為訓練集。然后對這k次運行的結果(例如準確度、誤差)進行平均,以獲得對模型性能的更穩(wěn)健的估計。優(yōu)點是每個數(shù)據(jù)點都用于訓練和驗證,降低了評估中的偏差風險。linear_reg_cv=LinearRegression()scaler=StandardScaler()pipeline=make_pipeline(StandardScaler(),LinearRegression())kf=KFold(n_splits=6,shuffle=True,random_state=0)scoring=['neg_mean_absolute_error','neg_mean_squared_error','neg_root_mean_squared_error','r2']result=cross_validate(pipeline,X,y,cv=kf,return_train_score=True,scoring=scoring)MAE_mean=(-result['test_neg_mean_absolute_error']).mean()MAE_std=(-result['tes

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論