前言:
{
在看西瓜书11章的时候,突然想到模型的超参数问题。之前我都是在尝试别人的模型+自己凭感觉给的超参数,不过学习的时候最好不要靠感觉(话说靠感觉也要能解释的通)。
我记得去年我去了谷歌的线下开发者大会,当时遇到一个谷歌的工程师,我向他咨询为什么我修改的模型效果不好(我把inception模型中间部分的数据提取出来做特征,但是效果反而变差),当时那个工程师告诉我一些事情,大概就是这些模型都是程序自动生成的最优分类模型,分类任务的话就不需要再修改了。
现在,西瓜书已经看了一大半,该练练了。我不打算修改模型的结构,但至少试着自动调参。
}
正文:
{
hyperopt是一个操作非常简单的Python库。为了使用hyperopt,你需要做的就是把你的模型写成一个函数,其输入是各种参数,输出一种误差;并且设定好各个参数的范围,之后选择一种寻找方式让机器自动寻找最优参数。
下面用kaggle中"别过拟合"的数据集[2]来具体实现hyperopt:
导入各种库:
import numpy as np
import xgboost as xgb
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import KFold
import pandas as pd
import time
import datetime
import hyperopt
载入数据(这里并没有用到测试数据):
#set training
train_data = pd.read_csv("train.csv")
X_train = train_data[train_data.columns[2:]]
Y_train = train_data[train_data.columns[1]]
#no need for use of test data
train_data = pd.read_csv("train.csv")
X_test = train_data[train_data.columns[1:]]
kaggle大神[3]的模型代码的改版:
def train_model(X, X_test, y, params=None, n_fold=5, plot_feature_importan