每次在我們做模型的時候都會為模型的好壞而發愁,那么有沒有什么辦法可以有效的提高模型的評分呢?
今天我剛好學習到這里,那么我就記下來(主要防止自己忘記,哈哈哈!)
1 import sklearn 2 import numpy as np 3 import matplotlib 4 from matplotlib import pyplot as plt 5 import pandas as pd 6 %matplotlib inline 7 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 8 from sklearn.preprocessing import LabelEncoder 9 from sklearn.model_selection import train_test_split 10 df = pd.read_csv('汽車.data',header=None) 11 dataset=df.values 12 # print(dataset) 13 # print(df.info()) 14 # print(df.head()) #6個特征,1個標簽,都是object 15 encoder_list=[] #存放編碼器 16 # print(dataset) 17 encoder_set=np.empty(dataset.shape) 18 # print(encoder_set) 19 for i in range(len(dataset[1])): 20 encoder=LabelEncoder() 21 encoder_set[:,i]=encoder.fit_transform(dataset[:,i]) 22 encoder_list.append(encoder) #將列編碼器加入到列表中 23 #取出特征和標簽,並將fload轉int 24 print(encoder_set) 25 datasetX=encoder_set[:,:-1].astype(int) 26 datasetY=encoder_set[:,-1].astype(int) 27 train_X,test_X,train_Y,test_Y=train_test_split(datasetX,datasetY,test_size=0.2,random_state=9) 28 #構建隨機森林 29 from sklearn.ensemble import RandomForestClassifier 30 rf_regressor=RandomForestClassifier(max_depth=8,n_estimators=200) 31 rf_regressor.fit(train_X,train_Y) 32 print(test_X) 33 predict_test_y=rf_regressor.predict(test_X) 34 35 #評分 36 from sklearn.model_selection import cross_val_score 37 def print_model_score(classifier,test_X,test_Y): 38 acc=cross_val_score(classifier,test_X,test_Y,scoring='accuracy',cv=6).mean() 39 pre=cross_val_score(classifier,test_X,test_Y,scoring='precision_weighted',cv=6).mean() 40 rec=cross_val_score(classifier,test_X,test_Y,scoring='recall_weighted',cv=6).mean() 41 f1=cross_val_score(classifier,test_X,test_Y,scoring='f1_weighted',cv=6).mean() 42 print('准確率:',acc,'精確率',pre,'召回率',rec,'F1',f1) 43 print_model_score(rf_regressor,test_X,test_Y) 44 #這里我們模型的分數就已經全部出來了
這里我們的書就已經求出來了

這里截圖展示一下
現在我們開始進行優化
優化分為兩種:
1、驗證曲線(主要用於隨機森林中對節支的限制,這里隨機森林中有三個參數,這里我們因為要求的最優值是:n_estimators=,所有)
2、學習曲線(主要用於隨機森林中對數據集的分割,數據集在什么位置分開是最合適的)
直接上代碼:
#參數組合:驗證曲線
#訓集合大小:學習曲線
from sklearn.model_selection import validation_curve
vc_classifier = RandomForestClassifier(min_samples_split=50,random_state=9,max_depth=8)
#生成一組參數數
param_grid = np.linspace(start=100,stop=400,num=20).astype(int) #20,40,60,80
# print(param_grid)
#獲取訓練得分和驗證得分
traint_score,validation_score=validation_curve(vc_classifier,train_X,train_Y,'n_estimators',param_grid,cv=6)
# print(traint_score)
plot_valid_curve(param_grid,traint_score,validation_score,'驗證曲線','n_estimators 值','准確率')

這里的紅線,我們暫時不用看,首相看藍線,我們看這條線時首相要明白,x軸越小,但是y軸要越大,這個點事自己挑的
隨意的挑,但是一定要符合條件,就是x軸最小,但是y軸是最大的,就像這里,x軸為150的時候y軸最低,x軸為200的時候
y軸相對平穩,所以我們這里取值,200,也就是說,隨機森林的樹的個數是200,n_estimators=200是最優的模型
這是第一種優化方式,第二種方式:
學習曲線
上代碼
1 from sklearn.model_selection import learning_curve 2 #初始化模型 3 lc_classifier = RandomForestClassifier(n_estimators=140,max_depth=10,random_state=9) 4 param_spilit=np.linspace(start=0.1,stop=0.9,num=10) 5 # print(param_spilit) 6 train_sizers,train_score,valid_score=learning_curve(lc_classifier,datasetX,datasetY,train_sizes=param_spilit,cv=6) 7 plot_valid_curve(param_spilit,train_score,valid_score,'學習曲線','訓練集大小','模型得分') 8 9 #這里要得到的是分割的最優點在哪里
得到數據的截圖:

這里我們看紅線,可以暫時理解藍線為驗證曲線的得分,紅線為學習曲線的得分(應該不正確,歡迎大佬做出指導)
紅線中我們還是那個理論,x軸越小,y軸要越大,但是相鄰的點要比較平穩
這里我們選擇的分割點為0.45,這是我們的最優點
那么我們最終的模型就得出來了,
1 train_X,test_X,train_Y,test_Y=train_test_split(datasetX,datasetY,test_size=0.55,random_state=9) #這里分割數據集是最優點,但是這里放的是預測集的份數,圖中求的是訓練集的份數所有需要1減去我們得的x軸的點 2 bast_classifier=RandomForestClassifier(n_estimators=200,random_state=9) 3 bast_classifier.fit(train_X,train_Y) 4 print_model_score(bast_classifier,test_X,test_Y) 5 6 7 8 #這里我們的模型就確定了,直接求分數
截圖

這里明顯分數上升了0.1個百分點,大功告成!
