使用sklearn進行數據挖掘系列文章:
- 1.使用sklearn進行數據挖掘-房價預測(1)
- 2.使用sklearn進行數據挖掘-房價預測(2)—划分測試集
- 3.使用sklearn進行數據挖掘-房價預測(3)—繪制數據的分布
- 4.使用sklearn進行數據挖掘-房價預測(4)—數據預處理
- 5.使用sklearn進行數據挖掘-房價預測(5)—訓練模型
- 6.使用sklearn進行數據挖掘-房價預測(6)—模型調優
通過上一節的探索,我們會得到幾個相對比較滿意的模型,本節我們就對模型進行調優
網格搜索###
列舉出參數組合,直到找到比較滿意的參數組合,這是一種調優方法,當然如果手動選擇並一一進行實驗這是一個十分繁瑣的工作,sklearn提供了GridSearch-網格搜索
方法,我們只需要將每一個參數的取值告訴它,網格搜索將使用交叉驗證方法對所有情況進行驗證,並返回結果最好的組合。
from sklearn.model_selection import GridSearchCV
param_grid = [
# 12 (3×4) 種超參數組合
{'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]}, #組合1
# 6 (2×3) 種
{'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},#組合2
]
forest_reg = RandomForestRegressor(random_state=42)
# 5折交叉驗證,總共需要 (12+6)*5=90 次訓練
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
scoring='neg_mean_squared_error')
grid_search.fit(housing_prepared, housing_labels)
Note:上面param_grid
中的字典key可不是隨便起的,這些都是需要網格搜索的模型中的參數。另外當你不知道如何選取參數的時候可以按照10的平方取值或者從小到大的值。
- 1.看看上面的結果(可能是一個漫長的過程):
>>grid_search.best_params_
{'max_features': 8, 'n_estimators': 30}
- 2.再看一看最好的分類器
>>grid_search.best_estimator_
RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
max_features=8, max_leaf_nodes=None, min_impurity_split=1e-07,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=30, n_jobs=1,
oob_score=False, random_state=42, verbose=0, warm_start=False)
- 3.看一看得分
>>grid_search.best_score_
-2469578258.9821739
如果我們想看以下各個參數組合的情況呢?
cv_result = grid_search.cv_results_
cv_result是一個字典類型,記錄了整個訓練過程的數據
>>cv_result.keys(
['std_train_score',
'rank_test_score',
'split4_test_score',
'param_bootstrap',
'split2_train_score',
'param_n_estimators',
'std_score_time',
'split4_train_score',
'split2_test_score',
'mean_score_time',
'mean_fit_time',
'split3_train_score',
'split0_train_score',
'std_test_score',
'split1_train_score',
'split0_test_score',
'mean_test_score',
'param_max_features',
'params',
'std_fit_time',
'split3_test_score',
'mean_train_score',
'split1_test_score']
- 4.看一下組合的分值
>>for mean_score, params in zip(cv_result ["mean_test_score"], cv_result ["params"]):
print(np.sqrt(-mean_score), params)
(63825.047930176741, {'max_features': 2, 'n_estimators': 3})
(55643.842909084706, {'max_features': 2, 'n_estimators': 10})
(53380.65668593633, {'max_features': 2, 'n_estimators': 30})
(60959.138858487866, {'max_features': 4, 'n_estimators': 3})
(52740.584166652523, {'max_features': 4, 'n_estimators': 10})
(50374.142146147307, {'max_features': 4, 'n_estimators': 30})
(58661.2866461823, {'max_features': 6, 'n_estimators': 3})
(52009.973979776936, {'max_features': 6, 'n_estimators': 10})
(50154.117773684942, {'max_features': 6, 'n_estimators': 30})
(57865.361680144459, {'max_features': 8, 'n_estimators': 3})
(51730.075508665534, {'max_features': 8, 'n_estimators': 10})
(49694.851433344418, {'max_features': 8, 'n_estimators': 30})
(62874.407393096284, {'max_features': 2, 'n_estimators': 3, 'bootstrap': False})
(54561.939815728343, {'max_features': 2, 'n_estimators': 10, 'bootstrap': False})
(59416.646314497353, {'max_features': 3, 'n_estimators': 3, 'bootstrap': False})
(52660.245911032733, {'max_features': 3, 'n_estimators': 10, 'bootstrap': False})
(57490.016827879947, {'max_features': 4, 'n_estimators': 3, 'bootstrap': False})
(51093.905942805257, {'max_features': 4, 'n_estimators': 10, 'bootstrap': False})
上面正好有18種組合結果。在第四節的時候,我們自己定義了一個estimatorCombinedAttributesAdder
其中有一個參數add_bedrooms_per_room
我們也可以將其加入網格搜索中。
在測試集合上評估模型###
上面我們已經得到了我們最好的模型,那么模型到底如何呢?是騾子是馬拉出來溜溜,測試集該上場了,
final_model = grid_search.best_estimator_
#去掉標簽
X_test = strat_test_set.drop("median_house_value", axis=1)
y_test = strat_test_set["median_house_value"].copy()
#這個時候只需要transform
X_test_prepared = full_pipeline.transform(X_test)
final_predictions = final_model.predict(X_test_prepared)
#均方誤差
final_mse = mean_squared_error(y_test, final_predictions)
final_rmse = np.sqrt(final_mse)
>>final_rmse
47766.003966433083
持久化模型###
模型已經建立好了,當下次再使用的時候,為了避免再次繁瑣的訓練過程,我們考慮將模型給存儲
起來,python提供了pickle
方法,當然我們也可以使用sklearn提供的joblib
方法,這種方法相對更加的高效。
from sklearn.externals import joblib
#存儲
joblib.dump(final_model,'best_model.pkl')
#加載
best_model = joblib.load('best_model.pkl')
#后續的使用....
總結###
至此,本系列的使用sklearn對房價進行預測的文章就此結束,本系列文章主要介紹了並實戰了數據挖掘過程種的一些步驟、工具的使用方法及技巧。一路走來看似平坦實則為坑坑窪窪,還有很多需要完善的地方,如特征的組合、模型的選擇等等。希望看完本系列之后能夠讓你對數據挖掘有更深的理解^-^(完)