模型的选择与调优
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?模型的選擇與調優
1 交叉驗證
1.1 交叉驗證過程
交叉驗證:為了讓被評估的模型更加準確可信
交叉驗證的意義:為了使一部分數據即當成驗證集,也做過訓練集,更加準確得出準確率,把最后的準確率取平均值。
注意:線上的測試數據才有測試集如果沒有測試數據集,怎么知道結果好與不好,那就把訓練集分成訓練集和驗證集(和測試集沒關系,拋開測試集)。
交叉驗證過程:將拿到的數據分為數據集和驗證集。以下圖為例:將數據分成5份,其中一份作為驗證集。然后經過5次(組)的測試,每次都更換不同的驗證集。即得到5組模型的結果,取平均值作為最終結果。又稱5折交叉驗證。10折交叉驗證是最常用的。
1.2 交叉驗證目的
使用交叉驗證方法的目的主要有2個:
①從有限的學習數據中獲取盡可能多的有效信息;
②可以在一定程度上避免過擬合問題。
1.3 交叉驗證API
使用交叉驗證的最簡單的方法是在估計器和數據集上使用cross_val_score函數。
sklearn.model_selection._validation.cross_val_score
def cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
參數:? ? ?estimator:模型估計器? ? ? ? ? ? ?X:特征變量集合? ? ? y:目標變量
cv:使用默認的3折交叉驗證,整數指定一個(分層)KFold中的折疊數? ? ? ? ? ? ? ? ? ? return :預估系數
1.4 案例
from sklearn.model_selection._validation import cross_val_score from sklearn.datasets import load_digits from sklearn import linear_model diabetes = load_digits() X = diabetes.data[:150] y = diabetes.target[:150] lasso = linear_model.Lasso() print(cross_val_score(lasso, X, y))2 網格搜索-超參數搜索
通常情況下,有很多參數是需要手動指定的(如k-近鄰算法中的K值),這種叫超參數。但是手動過程繁雜,所以需要對模型預設幾種超參數組合。每組超參數都采用交叉驗證來進行評估。最后選出最優參數組合建立模型。
2.1 網格搜索API
sklearn.model_selection.GridSearchCV
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
常改參數:? ? ? ? ? ? ? ? ? ? ? ? ?estimator:估計器對象? ? ? ? ? ? ? ???param_grid:估計器參數(dict){“n_neighbors”:[2,4,6]}
cv:指定幾折交叉驗證? ? ? ? ? ? ? ?
常用方法:? ? ? ?
fit(X,?y=None,?groups=None,?**fit_params):輸入訓練數據,與所有參數組合運行
score(X,?y=None):準確率
predict(X):調用使用最佳找到的參數對估計量進行預測,X:可索引,長度為n_samples
常用屬性
best_score_:在交叉驗證中測試的最好結果
best_estimator_:最好的參數模型
cv_results_:每次交叉驗證后的測試集準確率結果和訓練集準確率結果
2.2 案例
from sklearn.model_selection import GridSearchCV from sklearn.neighbors import KNeighborsClassifier import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler#1 讀取數據 data = pd.read_csv("./data/train.csv")#2 處理數據,截取部分數據 data = data.query("x > 1.0 & x < 1.5 & y > 2.5 & y < 3") timev = pd.to_datetime(data['time'],unit='s') timev = pd.DatetimeIndex(timev)#構造新特征 data['day']=timev.day data['hour'] = timev.hour data['weekday'] = timev.weekday #刪除時間特性,pandas的列是1,sklearn的列是0 data.drop(['time'],axis=1)#根據palce_id分組 data_count = data.groupby('palce_id').count()#調用reset_index,reset_index()的所用是把索引palce_id變成某一列,便于獲取 tf = data_count[data_count.row_id>5].reset_index()#篩選data里面id是tf里面的id,在就保留下來 data[data['place_id'].isin(tf.place_id)]# 取出數據當中的特征值和將place_id作為目標值, y = data['place_id'] x = data.drop(['place_id'], axis=1)# 將數據的分割成訓練集合測試集 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)#3 特征工程標準化 std = StandardScaler() x_train = std.fit_transform(x_train) x_test = std.transform(x_test)#進行算法流程 使用網格驗證超參數在這不加 knn = KNeighborsClassifier()#構造參數值進行搜索,字典形式 params = {"n_neighbor":[2,4,6,8]}#進行網格搜索 gsc = GridSearchCV(knn,params,cv=3) gsc.fit(x_train,y_train)# 預測準確率 print("在測試集上準確率:", gsc.score(x_test, y_test)) print("在交叉驗證當中最好的結果:", gsc.best_score_) print("選擇最好的模型是:", gsc.best_estimator_) print("每個超參數每次交叉驗證的結果:", gsc.cv_results_)?
總結
- 上一篇: putty连接linux上传python
- 下一篇: hive - 自定义函数(超详细步骤,手