专访挥霍的人生:8个竞赛冠军!
问题1:个人简介
给大家介绍下自己吧,个人信息、个人社交(github、知乎、csdn)地址、个人经历、竞赛经历
大家好,我叫周青松,比赛ID号叫挥霍的人生
。我已经混迹赛圈五年了,我来自哈尔滨工业大学(深圳),主要研究方向是NLP。
个人竞赛冠军经历简单如下:
首届“云移杯”全国旅游大数据挑战赛(冠军)
首届全国高校大数据应用创新大赛(冠军)
第二届易观算法大赛-开源组(冠军)
首届太湖信用大数据-企业合规风险预测(冠军)
DIGIX 华为极客算法精英大赛(冠军)
中移集成首届 OneCity 编程大赛(冠军)
腾讯游戏安全算法大赛-NLP 赛道(冠军)
银联商务-商户流失风险预测(冠军)
2021腾讯广告算法大赛-多模态视频广告标签(排行榜第一)
Sodic 2021-人岗精准匹配模型(排行榜第一)
问题2:学习过程
知识点的学习过程、对什么方便比较熟悉?
个人觉得直接上手一个实际项目是最快能学习到这个知识的地方,分析这个任务需要什么,再在网上查找基于这个任务相关的资料加以学习就能让自己进步飞快,我也是靠这种方式才逐步拿到许多竞赛的top。
问题3:竞赛经历
参加过什么竞赛,有什么收获,或者难忘的经历?
首届“云移杯”全国旅游大数据挑战赛,这个比赛让我印象非常深刻,这是我第一次接触NLP,任务就是对一个评论进行情感极性分类。
在这比赛我也是在网上找到了类似文本分类的baseline (tfidf+线性模型+stacking方案),这个方案一直在后几年里都让我能在不同比赛取得不错的效果。
问题4:竞赛分享
可以选一个知识点或者竞赛进行分享。
这里就介绍下文本特征列大杀器,tfidf+线性模型+stacking。
tfidf不用多说本身也是一种基于统计词频的方案,sklearn里面有很方便的计算tfidf的方法,并且也有相应的稀疏矩阵保存方法,这里值得一提的是,稀疏矩阵是可以直接丢到线性模型中进行分类的。
tfidf
tf = TfidfVectorizer(ngram_range=(1, 1),
min_df=3, max_df=0.9, use_idf=1,
smooth_idf=1, sublinear_tf=1)
discuss_tf = tf.fit_transform(data['review']).tocsr()
这里面ngram_range在不同的比赛可调不同的比例,其他参数就是祖传参数往往能取得不错效果,然后tocsr也通过稀疏矩阵的方式进行训练,小内存机器也可以训练。
线性模型+stacking
def get_sklearn_classfiy_stacking(clf, train_feature, test_feature, score, model_name, class_number, n_folds, train_num, test_num):
print('\n****开始跑', model_name, '****')
stack_train = np.zeros((train_num, class_number))
stack_test = np.zeros((test_num, class_number))
score_mean = []
skf = StratifiedKFold(n_splits=n_folds, random_state=1017)
tqdm.desc = model_name
for i, (tr, va) in enumerate(skf.split(train_feature, score)):
clf.fit(train_feature[tr], score[tr])
score_va = clf._predict_proba_lr(train_feature[va])
score_te = clf._predict_proba_lr(test_feature)
score_single = roc_auc_score(score[va], clf._predict_proba_lr(train_feature[va])[:, 1])
score_mean.append(np.around(score_single, 5))
stack_train[va] += score_va
stack_test += score_te
stack_test /= n_folds
stack = np.vstack([stack_train, stack_test])
df_stack = pd.DataFrame()
for i in range(stack.shape[1]):
df_stack['tfidf_' + model_name + '_classfiy_{}'.format(i)] = stack[:, i]
print(model_name, '处理完毕')
return df_stack, score_mean
model_list = [
['LogisticRegression', LogisticRegression(random_state=1017, C=3)],
['SGDClassifier', SGDClassifier(random_state=1017, loss='log')],
['PassiveAggressiveClassifier', PassiveAggressiveClassifier(random_state=1017, C=2)],
['RidgeClassfiy', RidgeClassifier(random_state=1017)],
['LinearSVC', LinearSVC(random_state=1017)]
]
feature = pd.DataFrame()
for i in model_list:
stack_result, score_mean = get_sklearn_classfiy_stacking(i[1], train_feature, test_feature, score, i[0], 2, 5, len(df_train), len(df_test))
feature = pd.concat([feature, stack_result], axis=1, sort=False)
print('五折结果', score_mean)
print('平均结果', np.mean(score_mean))
result = stack_result[len(df_train):]
put_result = pd.DataFrame()
put_result['ID'] = df_test['ID']
put_result['Pred'] = list(result['tfidf_' + i[0] + '_classfiy_{}'.format(1)])
put_result.to_csv('result/result_' + i[0] + '_' + str(np.around(np.mean(score_mean), 5)) + '.csv', index=False)
feature.to_csv('features/tfidf_classfiy_stacking.csv', index=False)
一般tfidf降维方法则是通过svd进行降维,此种方法其实是会丢失很多信息的,而基于多组线性模型stacking后降维基本上不会损失信息,而这种方案也有通用性,只要包含文本字段均可采用此方案进行降维。
整理不易, 点 赞 三连 ↓