1. 程式人生 > >sklearn joblib 交叉驗證函式 cross_val_score

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")