sklearn joblib 交叉驗證函式 cross_val_score
sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, scoring=’raise-deprecating’)
只介紹幾個常用的引數:
- estimator 將要訓練的模型
- X 訓練集
- y 標籤
- scoring: string 選擇返回的誤差函式型別,
- cv : int 預設分成3個folds,指定後分成cv個folds
簡單的介紹一下k-folds 交叉驗證:
隨機將資料集分為k個不同的子集,稱為folds, 然後在訓練和驗證決策樹模型k次,每一次選擇一個不同的子集作為驗證集,在另外k-1個子集上訓練。返回結果是結果是一個長度為k 的陣列,值為在k個fold上的誤差值
def display_scores(scores):
print("Scores:", scores)
print("Mean:", scores.mean())
print("Standard deviation:", scores.std())
from sklearn.ensemble import RandomForestRegressor
forest_reg = RandomForestRegressor()
forest_reg.fit(housing_prepared, housing_labels)
forest_scores = cross_val_score(forest_reg, housing_prepared, housing_labels,
scoring="neg_mean_squared_error", cv=10)
housing_predicitions =forest_reg.predict( housing_prepared)
forest_mse = mean_squared_error(housing_predicitions, housing_labels)
forest_rmse = np.sqrt(forest_mse)
print(forest_rmse)
forest_rmse_scores = np.sqrt(-forest_scores)
display_scores(lin_rmse_scores)
out:
22056.180234873842
Scores: [66782.73843989 66960.118071 70347.95244419 74739.57052552
68031.13388938 71193.84183426 64969.63056405 68281.61137997
71552.91566558 67665.10082067]
Mean: 69052.46136345083
Standard deviation: 2731.6740017983466
注意效果並不好,並且在訓練集的誤差要低於驗證集上的誤差很多,這說明模型仍然存在過擬合問題, 解決方法:
- 簡化模型
- 增加正則化等約束
- 增加訓練集
當然,應該要嘗試更多其他的模型, 支援向量機等,最終確定1到2中潛在的模型
最好將每個試驗過的模型儲存以便於後面的使用,確保保留了超引數和訓練的引數,驗證集上的表現分數,甚至預測值。 可以使用pickle或sklearn.externals.joblib,後者在序列化大陣列是更高效
用法和pickle相同呢。
from sklearn.externals import joblib
# joblib.dump(my_model, "my_model.pkl")
# # and later...
# my_model_loaded = joblib.load("my_model.pkl")