回归综合案例——利用回归模型预测鲍鱼年龄
回歸綜合案例——利用回歸模型預測鮑魚年齡
1 數據集探索性分析
首先將鮑魚數據集abalone_dataset.csv讀取為pandas的DataFrame格式。
import pandas as pd import warnings warnings.filterwarnings('ignore') data = pd.read_csv(r"C:\Users\86182\Desktop\abalone_dataset.csv") data.head() #查看數據集中樣本數量和特征數量 data.shape(4177,9)
#查看數據信息,檢查是否有缺失值 data.info() data.describe()
數據集一共有4177個樣本,每個樣本有9個特征,其中rings為鮑魚環數,能夠代表鮑魚年齡,是預測變量。除了sex為離散特征,其余都為連續變量。
觀察sex列的取值分布情況。
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline sns.countplot(x = "sex",data = data) data['sex'].value_counts()
對于連續特征,可以使用seaborn的distplot函數繪制直方圖觀察特征取值情況。我們將8個連續特征的直方圖繪制在一個4行2列的子圖布局中。
從以上連續特征之間的散點圖我們可以看到一些基本的結果:
●例如從第一行可以看到鮑魚的長度length 和鮑魚直徑diameter 、鮑魚高度height 存在明顯的線性關系。鮑魚長度與鮑魚的四種重量之間存在明顯的非線性關系。
●觀察最后一行,鮑魚環數rings 與各個特征均存在正相關性,中與height 的線性關系最為直觀。
●觀察對角線上的直方圖,可以看到幼鮑魚( sex 取值為")在各個特征上的取值明顯小于其他成年鮑魚。而雄性鮑魚( sex取值為“M")和雌性鮑魚( sex 取值為“F")各個特征取值分布沒有明顯的差異。
為了定量地分析特征之間的線性相關性,我們計算特征之間的相關系數矩陣,并借助熱力圖將相關性可視化。
corr_df = data.corr() corr_df fig,ax = plt.subplots(figsize=(12,12)) #繪制熱力圖 ax = sns.heatmap(corr_df,linewidths=.5,cmap="Greens",annot=True,xticklabels=corr_df.columns,yticklabels=corr_df.index) ax.xaxis.set_label_position('top') ax.xaxis.tick_top()2 鮑魚數據預處理
2.1 對sex特征進行Onehot編碼,便于后續模型納入啞變量
使用pandas的get_dummies函數對sex特征做Onehot編碼處理。
2.2 添加取值為 1 的特征
2.3 根據鮑魚環計算年齡
一般每過一年,鮑魚就會在殼上留下一道深深地印記,這叫生長紋,就相當于樹木的年輪。在本數據集中,我們要預測的是鮑魚的年齡,可以通過環數rings加上1.5得到。
2.4 篩選特征
將預測目標設置為age列,然后構造兩組特征,一組包含ones,一組包含ones。對于sex相關的列,我們只使用sex_F和sex_M。
2.5 將鮑魚數據集劃分為訓練集和測試集
將數據集隨機劃分為訓練集和測試集,其中80%樣本為訓練集,剩余20%樣本為測試集。
3 實現線性回歸和嶺回歸
3.1 使用Numpy實現線性回歸
如果矩陣xTx為滿秩(行列式不為0),則簡單線性回歸的解為W=(XTx)-1xTy。實現一個函數linear _regression, 其輸入為訓練集特征部分和標簽部分,返回回歸系數向量。我們借助numpy 工具中的np. linalg. det函數和np. linalg. inv函數分別求矩陣的行列式和矩陣的逆。
使用上述實現的線性回歸模型在鮑魚訓練集上訓練模型。
w1 = linear_regression(X_train,y_train) w1 = pd.DataFrame(data = w1,index=X.columns,columns = ["numpy_w"]) w1.round(decimals=2)
可見我們求得的模型為:
y=-l.12 х length + 10 х diameter + 20.74 х height + 9.61 х whole_ weight-20.05 х shucked_ weight - 12.07 х viscera_ weight + 6.55 х shell_ weight + 0.88x sex_ F+0.87 x sex_ M + 4.32
3.2 使用sklearn實現線性回歸
from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(X_train[features_without_ones],y_train) print(lr.coef_) w_lr = [] w_lr.extend(lr.coef_) w_lr.append(lr.intercept_) w1["lr_sklearn_w"] = w_lr w1.round(decimals=2)
3.3 使用Numpy實現嶺回歸(Ridge)
在鮑魚訓練集上使用ridge_regression函數訓練嶺回歸模型,正則化系數設置為1.
3.4 利用sklearn實現嶺回歸
與sklearn中嶺回歸對比,同樣正則化系數設置為1。
3.5 嶺跡分析
4 使用LASSO 構建鮑魚年齡預測模型
from sklearn.linear_model import Lasso lasso = Lasso(alpha=0.01) lasso.fit(X_train[features_without_ones],y_train) print(lasso.coef_) print(lasso.intercept_) coef = pd.DataFrame() for alpha in np.linspace(0.0001,0.2,20):lasso_clf = Lasso(alpha=alpha)lasso_clf.fit(X_train[features_without_ones],y_train)df = pd.DataFrame([lasso_clf.coef_],columns=X_train[features_without_ones].columns)df['alpha'] = alphacoef = coef.append(df,ignore_index=True) coef.head() #繪圖 plt.figure(figsize=(9, 6),dpi=600) for feature in X_train.columns[:-1]:plt.plot('alpha',feature,data=coef) plt.legend(loc='upper right') plt.xlabel(r'$\alpha$',fontsize=15) plt.ylabel('系數',fontsize=15) plt.show() coef5 鮑魚年齡預測模型效果評估
from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error from sklearn.metrics import r2_score #MAE y_test_pred_lr = lr.predict(X_test.iloc[:,:-1]) print(round(mean_absolute_error(y_test,y_test_pred_lr),4)) y_test_pred_ridge = ridge.predict(X_test[features_without_ones]) print(round(mean_absolute_error(y_test,y_test_pred_ridge),4)) y_test_pred_lasso = lasso.predict(X_test[features_without_ones]) print(round(mean_absolute_error(y_test,y_test_pred_lasso),4))1.6016
1.5984
1.6402
5.3009
4.959
5.1
0.5257
0.5563
0.5437
5.2 殘差圖
殘差圖是一種用來診斷回歸模型效果的圖。在殘差圖中,如果點隨機分布在0附近,則說明回歸效果較好。如果在殘差圖中發現了某種結構,則說明回歸效果不佳,需要重新建模。
總結
以上是生活随笔為你收集整理的回归综合案例——利用回归模型预测鲍鱼年龄的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鲍鱼数据案例(岭回归 、LASSO回归)
- 下一篇: 岭回归实现鲍鱼年龄预测 MATLAB实现