天天看點

2020研究所學生數模整理(1):機器學習回歸+GridSearch參數調優+AutoML(TPOT)+模型評估+決策樹繪制1 三種回歸模型2 GridSearch參數調優3 AutoML:TPOT4 模型評估:評估名額及殘差圖

本文将介紹以下四點内容:

(1)三種回歸模型:線性回歸、随機森林(輸出決策樹圖)、梯度提升回歸;

(2)使用GridSearch對機器學習模型進行參數調優;

(3)自動機器學習包:TPOT;

(4)回歸模型的評估:評估名額+殘差圖。

2020研究所學生數學模組化比賽已經收尾,我們組選擇的是B題,預測汽油辛烷值損失的模組化。一般來講,對分類變量進行預測使用分類器,對連續變量進行預測使用回歸。本文為整理的模組化中所用的回歸模型,歡迎交流,指出不足。

1 三種回歸模型

本部分要介紹的三種模型都是用于回歸的模型,這裡變量已經經過了篩選,特征工程已經結束,主要作為數模所使用的方法的整理彙總。其中線性回歸原理比較簡單,随機森林和梯度提升回歸都是基于樹的決策,随機森林是多棵樹,相對于

1.1 線性回歸

線性回歸的原理比較簡單,不多說,直接上代碼。

#載入包
import pandas as pd
import numpy as np  
from sklearn.model_selection import train_test_split #使用者劃分訓練集和測試集
from sklearn.linear_model import LinearRegression  #線性回歸包
from sklearn import metrics  #模型評估包
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
#以下為後續繪圖用包
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

#資料讀取
data= pd.read_csv("D:/course/other/shumo_code_2020/data/data_for_q3.csv")
del data["index"]
#訓練集和測試集的劃分
data_train, data_test= train_test_split(data,test_size=0.3, random_state=0) #參數test_size表示測試集的比例
train_y = data_train.RON_loss
columns = data_train.columns.tolist()
train_X = data_train.drop(["RON_loss"],axis = 1)
test_X = data_test.drop(["RON_loss"],axis = 1)
test_y = data_test.RON_loss
#構模組化型
model = LinearRegression()
model = model.fit(train_X, train_y)

#模型應用:進行值的預測,訓練集和測試集都要預測是為了評估模型的能力以及有沒有過拟合的問題,關于模型評估請見第四部分
#預測訓練集的Y值
train_y_predict = model.predict(train_X)
#預測測試集的Y值
predicted_values = model.predict(test_X)
           

1.2 随機森林

随機森林是基于樹的回歸,這裡會介紹如何使用随機森林進行模組化以及如何輸出決策過程,即決策樹的建構過程:根節點是哪個,以及各個節點的屬性值等。

1.2.1 模型

資料集的劃分過程将不再展示,直接展示模組化部分。在随機森林的模組化過程中,不僅僅要挑選樣本,還要挑選變量,是以這裡有一個max_features參數,在設定時要注意不能超過變量總數,有關其他參數的調優,可以參考第三部配置設定合GridSearch使用。

from sklearn.ensemble import RandomForestRegressor  #随機森林回歸包,注意和随機森林分類器的包區分
#資料集劃分和前面線性回歸一緻
RFmodel = RandomForestRegressor(n_estimators= 500, bootstrap=True, max_features= 19, min_samples_leaf=5, random_state=42)
RFmodel.fit(train_X,train_y)

train_y_predict = RFmodel.predict(train_X)
predicted_values = RFmodel.predict(test_X)
           

1.2.2 決策樹輸出

決策樹的輸出需要安裝一個外部庫,export_graphviz,官網下載下傳連結:http://www.graphviz.org/download/,下載下傳後輕按兩下安裝,找到安裝目錄,将bin檔案路徑加入系統環境變量,比如我的是:D:\programesfilefolder\Graphviz\bin。配置完成後,打開指令行,輸入dot -version,如果出現版本資訊,則配置成功。

from sklearn.tree import export_graphviz  #載入包

rf_small = RandomForestRegressor(n_estimators = 500,bootstrap=False,max_features = 19, min_samples_leaf= 5 , random_state=42)
rf_small.fit(train_X, train_y)
tree_small = rf_small.estimators_[5]
export_graphviz(tree_small, out_file ='D:/course/other/shumo_code_2020/result/q2/tree2.dot', feature_names = train_X.columns.tolist() , rounded = True, precision = 1)
           

到這裡,決策樹的dot檔案已經生成了,接下來需要将指令行切換至目前目錄,執行dot -Tpdf tree2.dot -o tree2.pdf,一定要先切換目錄,不然找不到tree檔案的,也可以存成png圖檔格式,建議存成pdf,更加清晰。

1.3 梯度提升回歸

GradientBoostingRegressor方法強調一群弱的決策方法實力可以和一個強的方法媲美,是以也是樹決策,這裡不再贅述,模組化過程和線性回顧以及随機森林的方法一緻。

2 GridSearch參數調優

GridSearch的調優方法可以說是簡單粗暴,我對Gridsearch的了解就是周遊,如果需要可視化結果的時候可以考慮自行周遊,以下結合随機森林對應用進行舉例。

from sklearn.model_selection  import GridSearchCV #載入包

param_grid = [
{'n_estimators': [100,200,300,400,500], 'max_features': [20,21,22,23,24,25,26]},
{'bootstrap': [False], 'n_estimators': [100,200,300,400,500], 'max_features': [20,21,22,23,24,25,26]},
]
 
forest_reg = RandomForestRegressor()
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
                          scoring='neg_mean_squared_error') 
grid_search.fit(train_X,train_y)
best_estimator = grid_search.best_estimator_
print(best_estimator)

           

其實如果想做個模型表現随參數變化的圖,可以使用交叉驗證自行周遊,以下為自行周遊生成圖的過程。

from sklearn.model_selection import cross_val_score

score_lst = []
best_score = -1

for min_samples_leaf in [1,3,5,7,9,11,13]:
    for max_features in [19,20,21,22,23,24,25]:
        forest_reg = RandomForestRegressor(n_estimators = 500,bootstrap=False,max_features = max_features, min_samples_leaf=min_samples_leaf, random_state=42)
        score = cross_val_score(forest_reg,train_X,train_y,cv=5,scoring='neg_mean_squared_error')
        score_lst.append(score.mean())
        if score.mean() > best_score:
            best_score = score.mean()
            best_parameters = {'min_samples_leaf':min_samples_leaf,"max_features":max_features}
            print(min_samples_leaf,max_features,score.mean())
        else:
            pass
            
print('Best socre:{:.2f}'.format(best_score))
print('Best parameters:{}'.format(best_parameters))
print(score_lst)

#繪制三維圖
#導入庫
import numpy as np  
import matplotlib.pyplot as plt  
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D  #三維圖繪制包
import pandas as pd  
import seaborn as sns     


min_samples_leaf_lst = np.array([1,3,5,7,9,11,13])
max_features_lst = np.array([19,20,21,22,23,24,25])
xx1, yy1 = np.meshgrid(min_samples_leaf_lst, max_features_lst)

newshape = (xx1.shape[0])*(xx1.shape[0])
y_input = yy1.reshape(newshape)
x_input = xx1.reshape(newshape)
z_input = np.array(score_lst).reshape(newshape)
sns.set(style='white')
sns.set(font_scale=0.8)
plt.figure(figsize=(25,10))
fig = plt.figure()

ax = fig.gca(projection='3d')
ax.plot_trisurf(x_input,y_input,z_input,cmap='rainbow')  

ax.set_ylabel('max_features',fontsize  = 8) 
ax.set_xlabel('min_samples_leaf',fontsize  = 8) 
ax.set_zlabel('score',fontsize  = 8) 
fig.tight_layout()
plt.savefig('RF_parameter_3D.png', dpi= 300)
plt.show()
           

結果圖:

2020研究所學生數模整理(1):機器學習回歸+GridSearch參數調優+AutoML(TPOT)+模型評估+決策樹繪制1 三種回歸模型2 GridSearch參數調優3 AutoML:TPOT4 模型評估:評估名額及殘差圖

3 AutoML:TPOT

自動機器學習是自動建立機器學習模型的工具,隻要輸入資料即可,隻是運作過程比較緩慢。具體過程和機器學習一樣,也需要劃分訓練集和測試集,模組化如下,輸出的py檔案為最優模型及對應的最優參數。

from tpot import TPOTRegressor #載入包
#資料集劃分同前
tpot = TPOTRegressor(generations=40, verbosity=2) #疊代20次
tpot.fit(train_X, train_y)
print(tpot.score(test_X, test_y))
tpot.export('pipeline2.py')
           

4 模型評估:評估名額及殘差圖

回歸模型的評估常用的兩個名額為均方誤差MSE,MAE和R2,都包含在sklearn.metrics中,可以參考官方文檔,也可以參考:https://www.cnblogs.com/harvey888/p/6964741.html,下面隻舉了MAE的使用方法,這裡将不再贅述。

#以MAE為例
from sklearn.metrics import median_absolute_error
print(median_absolute_error(train_y, train_y_predict))
print(median_absolute_error(test_y, predicted_values))

           

另外,回歸常見的可視化評估為繪制殘差圖。

data_train["ron_loss_predict"] = train_y_predict
data_test["ron_loss_predict"] = predicted_values
RF_predict = pd.concat([data_train,data_test],axis = 0)
#RF_predict
#作差
def cancha_func(lst):
    cancha_lst = []
    for item in lst:
        y1 = item[0]
        y2 = item[1]
        cancha_lst.append(y1-y2)
    return cancha_lst

loss1 = RF_predict["RON_loss"].tolist()
loss2 = RF_predict["ron_loss_predict"].tolist()
loss_all = list(zip(loss1,loss2))
RF_can = cancha_func(loss_all)
RF_predict["residual"] = RF_can
#sns.set(style="white")
sns.set(font_scale=1)
plt.figure(figsize=(6,4.5))
sns.set(style="dark")
ax = sns.residplot(RF_predict.index, RF_predict.residual, color="#821A7D")
ax.set_title("RF_residual")
ax.set(xlabel='sample_id', ylabel='RF_residual')
plt.savefig('./RF_residual.png',dpi = 300)
plt.show()
           

殘差圖:

2020研究所學生數模整理(1):機器學習回歸+GridSearch參數調優+AutoML(TPOT)+模型評估+決策樹繪制1 三種回歸模型2 GridSearch參數調優3 AutoML:TPOT4 模型評估:評估名額及殘差圖

TPOT參考連結:https://www.toutiao.com/i6873417340151824904/?tt_from=weixin_moments&utm_campaign=client_share&wxshare_count=2&timestamp=1600392869&app=news_article&utm_source=weixin_moments&utm_medium=toutiao_android&use_new_style=1&req_id=2020091809342901014708310411115455&group_id=6873417340151824904