R e g L 1 − L 2 RegL1-L2 RegL1−L2
第五步:调整正则化参数:reg_alpha 和reg_lambda
from xgboost import XGBClassifier
import xgboost as xgb
import pandas as pd
import numpy as np
import math
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import log_loss
from matplotlib import pyplot
import seaborn as sns
%matplotlib inline
# path to where the data lies
dpath = './data/'
train = pd.read_csv(dpath +"Otto_train.csv")
#train.head()
#sns.countplot(train.target);
#pyplot.xlabel('target');
#pyplot.ylabel('Number of occurrences');
# drop ids and get labels
y_train = train['target']
y_train = y_train.map(lambda s: s[6:])
y_train = y_train.map(lambda s: int(s)-1)
train = train.drop(["id", "target"], axis=1)
X_train = np.array(train)
# prepare cross validation
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)
第二轮参数调整得到的n_estimators最优值(645),其余参数继续默认值
用交叉验证评价模型性能时,用scoring参数定义评价指标。评价指标是越高越好,因此用一些损失函数当评价指标时,需要再加负号,如neg_log_loss,neg_mean_squared_error 详见sklearn文档:
http://scikit-learn.org/stable/modules/model_evaluation.html#log-loss
#reg_alpha = [1e-3, 1e-2, 0.05, 0.1] #default = 0
#reg_lambda = [1e-3, 1e-2, 0.05, 0.1] #default = 1
reg_alpha = [ 1.5, 2] #default = 0, 测试0.1,1,1.5,2
reg_lambda = [0.5, 1, 2] #default = 1,测试0.1, 0.5, 1,2
param_test5_1 = dict(reg_alpha=reg_alpha, reg_lambda=reg_lambda)
param_test5_1
xgb5_1 = XGBClassifier(
learning_rate =0.1,
n_estimators=645, #第二轮参数调整得到的n_estimators最优值
max_depth=6,
min_child_weight=4,
gamma=0,
subsample=0.7,
colsample_bytree=0.6,
colsample_bylevel = 0.7,
objective= 'multi:softprob',
seed=3)
gsearch5_1 = GridSearchCV(xgb5_1, param_grid = param_test5_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)
gsearch5_1.fit(X_train , y_train)
gsearch5_1.grid_scores_, gsearch5_1.best_params_, gsearch5_1.best_score_
gsearch5_1.cv_results_
# summarize results
print("Best: %f using %s" % (gsearch5_1.best_score_, gsearch5_1.best_params_))
test_means = gsearch5_1.cv_results_[ 'mean_test_score' ]
test_stds = gsearch5_1.cv_results_[ 'std_test_score' ]
train_means = gsearch5_1.cv_results_[ 'mean_train_score' ]
train_stds = gsearch5_1.cv_results_[ 'std_train_score' ]
pd.DataFrame(gsearch5_1.cv_results_).to_csv('my_preds_reg_alpha_reg_lambda_1.csv')
# plot results
test_scores = np.array(test_means).reshape(len(reg_alpha), len(reg_lambda))
train_scores = np.array(train_means).reshape(len(reg_alpha), len(reg_lambda))
#log_reg_alpha = [0,0,0,0]
#for index in range(len(reg_alpha)):
# log_reg_alpha[index] = math.log10(reg_alpha[index])
for i, value in enumerate(reg_alpha):
pyplot.plot(reg_lambda, -test_scores[i], label= 'reg_alpha:' + str(value))
#for i, value in enumerate(min_child_weight):
# pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:' + str(value))
pyplot.legend()
pyplot.xlabel( 'reg_alpha' )
pyplot.ylabel( '-Log Loss' )
pyplot.savefig( 'reg_alpha_vs_reg_lambda1.png' )