分類模型優化模型


每次在我們做模型的時候都會為模型的好壞而發愁,那么有沒有什么辦法可以有效的提高模型的評分呢?

今天我剛好學習到這里,那么我就記下來(主要防止自己忘記,哈哈哈!)

 

 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個百分點,大功告成!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM