网上有很多网格调参方法,笔者整理代码,编写了以下模型应用框架。不喜勿喷
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import make_pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
train_data = pd.read_csv('C://Users//holy//Desktop//train_feature.csv')
test_data= pd.read_csv('C://Users//holy//Desktop//test_feature.csv')
ztrain_data=train_data[(train_data.is_attributed==1)]#取正样例
N=len(ztrain_data)*2#取负样例为正样例的两倍
ftrain_data=train_data[(train_data.is_attributed==0)].sample(n=N)#取N倍负样例
df_train=pd.concat([ztrain_data,ftrain_data])#新训练数据
df_test=test_data
#3
# 使用pipeline定义文本分类问题常见的工作流,包含向量化和一个简单的分类器
pipeline = Pipeline([
('1-DTC',DecisionTreeClassifier()),
])
#参数空间
parameters = {
'1-DTC__max_depth': (1,2,3,4,5),
'1-DTC__max_features': (1,2,3,4),
}
#通过GridSearchCV寻求最佳参数空间
grid_search = GridSearchCV(pipeline,parameters)#网格搜索
clf=grid_search#本模型用线性回归
#特征工程
#1将day特征变成三列
names=df_train['day'].str.split('-',expand=True)
names.columns=['year','month','day0']
df_train=df_train.join(names)#转换日期特征,变成三列特征
names2=df_test['day'].str.split('-',expand=True)
names2.columns=['year','month','day0']
df_test=df_test.join(names2)#转换日期特征,变成三列特征
#数据集array
X_train =np.array(df_train.drop(['is_attributed','day'],axis = 1))
X_test=np.array(df_test.drop(['is_attributed','day','click_id'],axis = 1))
Y_train =np.array(df_train['is_attributed'])
Y_test=np.array(df_test['is_attributed'])
#定义准确率函数
def pre_rate(res):
count = 0
for i in range(len(res)):
if (Y_test[i] == res[i]):
count = count + 1
print(float(count / len(res)))
#训练模型
clf.fit(X_train,Y_train)
res=clf.best_estimator_.predict(X_test)
#误差分析
pre_rate(res)
# 输出最佳的分类器到底使用了怎样的参数
best_parameters = clf.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))