在现实任务中,面对繁花似锦的机器学习算法可供选择。为了使模型的泛化能力更好,在数据预处理以及特征工程完毕后,应该通过对比分析选择一种最优的算法模型作为最终的选择。具体的思路是,首先列举几种想到的常规使用且效果较好的算法,然后分别在训练集以及测试集上使用不同的评估指标进行评估,最终确定效果最好的算法模型。本文用鸢尾花卉数据集,以XGBoost和随机森林两个算法为例,进行评估选择,具体步骤如下所示。
#导入所需要的库
import numpy as np
import xgboost as xgb
from sklearn.ensemble import RandomForestClassifier as rf
from sklearn.model_selection import KFold, train_test_split
from sklearn.metrics import confusion_matrix, mean_squared_error
from sklearn.datasets import load_iris
#实例化数据集
iris = load_iris()
y = iris['target']
x = iris['data']
#训练集测试集划分
train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=1)
#实例化k折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=1)
#使用xgboost在训练集上做交叉验证
xgb_model_list = []
xgb_mse_list = []
for train_index, test_index in kf.split(train_X):
xgb_model = xgb.XGBClassifier().fit(train_X[train_index], train_y[train_index])
xgb_model_list.append(xgb_model)
predictions = xgb_model.predict(train_X[test_index])
actuals = train_y[test_index]
print(confusion_matrix(actuals, predictions))
mse = mean_squared_error(actuals, predictions)
xgb_mse_list.append(mse)
print('xgb_mse_list:{}'.format(xgb_mse_list))
print('xgb mse均值为:{}'.format(np.mean(xgb_mse_list)))
输出结果如下:
xgb_mse_list:[0.0, 0.08333333333333333, 0.041666666666666664, 0.0, 0.08333333333333333]
xgb mse均值为:0.041666666666666664
#使用随机森林在训练集上做交叉验证
rf_model_list = []
rf_mse_list = []
for train_index, test_index in kf.split(train_X):
rf_model = rf(n_estimators=10, max_depth=10, random_state=10).fit(train_X[train_index],train_y[train_index])
rf_model_list.append(rf_model)
predictions = rf_model.predict(train_X[test_index])
actuals = train_y[test_index]
mse = mean_squared_error(actuals,predictions)
rf_mse_list.append(mse)
print('rf_mse_list:{}'.format(rf_mse_list))
print('rf mse均值为:{}'.format(np.mean(rf_mse_list)))
输出结果如下:
rf_mse_list:[0.08333333333333333, 0.041666666666666664, 0.08333333333333333, 0.041666666666666664, 0.08333333333333333]
rf mse均值为:0.06666666666666667
#模型评估与选择
if np.mean(rf_mse_list) <= np.mean(xgb_mse_list):
min_mse = min(rf_mse_list)
ind = rf_mse_list.index(mse)
best_estimators = rf_model_list[ind]
print('best estimator is random forest {}, mse is {}'.format(ind,min_mse))
else:
min_mse = min(xgb_mse_list)
ind = xgb_mse_list.index(min_mse)
best_estimators = xgb_model_list[ind]
print('best estimators is xgboost {}, mse is {}'.format(ind,min_mse))
输出结果如下:
best estimators is xgboost 0, mse is 0.0
#使用最好的模型和参数预测测试集,估计模型在实际使用时的判别能力
pred = best_estimators.predict(test_X)
mse = mean_squared_error(pred, test_y)
print('test data mse is {}'.format(mse))
print(confusion_matrix(test_y,pred))
输出结果如下:
test data mse is 0.03333333333333333
[[11 0 0]
[ 0 12 1]
[ 0 0 6]]
上过以上方法和步骤,最终选择了XGBoost算法模型作为最优模型。