1)进一步通过网格搜索法对3个模型进行调优(用5000条数据,调参时采用五折交叉验证的方式),并进行模型评估,展示代码的运行结果。(可以尝试使用其他模型)
2)模型融合,模型融合方式任意,并结合之前的任务给出你的最优结果。
例如Stacking融合,用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分结果。
在模型调参的过程中,需要使用到网格搜索(Grid Search)方法。为什么要交Grid Search呢? 其实就是一种穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。
以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫Grid Search。
Grid Search是一种我们常用的来寻找模型参数的方法,通过不断地组合去试验找到最好的参数。但是,我个人觉得其挺浪费时间的。和Grid Search相对的有另外一种调参方法叫做随机搜索(Random Search)。
RandomizedSearch实现了对参数的随机搜索, 其中每个设置都是从可能的参数值的分布中进行取样。 这对于穷举搜索有两个主要优势:
print ("----------程序开始运行!!!------------")
import pickle
import pandas as pd
import time
from sklearn.externals import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
time_start = time.time()
import warnings
warnings.filterwarnings("ignore")
def f1_score_vali(preds, data_vali):
labels = data_vali.get_label()
preds = np.argmax(preds.reshape(19, -1), axis=0)
score_vali = f1_score(y_true=labels, y_pred=preds, average='macro')
return 'f1_score', score_vali, True
"""=====================================================================================================================
0 读取特征
"""
print("0 读取特征")
data_fp = open( "data_w_tfidf.pkl", 'rb')
x_train, y_train, x_test = pickle.load(data_fp)
xTrain, xTest, yTrain, yTest = train_test_split(x_train, y_train, test_size=0.30, random_state=531)
"""=====================================================================================================================
1 模型训练(模型调参)
"""
print("模型训练")
params = {'penalty':['l2', 'l1'], 'C':[90,100,120,130,140]}
lr = LogisticRegression(C=120,dual=False)
gsearch = GridSearchCV(estimator=lr, param_grid=params, scoring='f1_macro', n_jobs=1, cv=5, verbose=3)
gsearch.fit(xTrain, yTrain)
print('最佳参数:',gsearch.best_params_)
print('训练集的最佳分数:', gsearch.best_score_)
print('测试集的最佳分数:', gsearch.score(xTest, yTest))
"""=====================================================================================================================
2 保存模型
"""
print('2 保存模型')
joblib.dump(lr,"LR(120)_data_w_tfidf.m")
"""=====================================================================================================================
3 预测结果
"""
print("预测结果")
y_test = lr.predict(x_test)
"""=====================================================================================================================
4 保存结果
"""
print("保存结果")
y_test = [i+1 for i in y_test.tolist()]
df_result = pd.DataFrame({'id':range(5000),'class':y_test})
df_result.to_csv('LR(c120)_data_w_tfidf.csv',index=False)
time_end = time.time()
print('共耗时:{:.2f}min'.format((time_end-time_start)/60))
参考:https://blog.csdn.net/u012914436/article/details/89132931#datawhale_day03