专访挥霍的人生:8个竞赛冠军!

问题1:个人简介

给大家介绍下自己吧,个人信息、个人社交(github、知乎、csdn)地址、个人经历、竞赛经历

大家好,我叫周青松,比赛ID号叫挥霍的人生。我已经混迹赛圈五年了,我来自哈尔滨工业大学(深圳),主要研究方向是NLP。

8f948d24e8931bf6f8f7520525c2e1aa.jpeg

我平时爱好就是参加比赛,参加比赛不仅能让我学到一些新的知识以及技术,每一次提交分数上升也会让我产生巨大的成就感。当然还有就是奖金的诱惑了。

个人竞赛冠军经历简单如下:

首届“云移杯”全国旅游大数据挑战赛(冠军)
首届全国高校大数据应用创新大赛(冠军)
第二届易观算法大赛-开源组(冠军)
首届太湖信用大数据-企业合规风险预测(冠军)
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后降维基本上不会损失信息,而这种方案也有通用性,只要包含文本字段均可采用此方案进行降维。

3bc188c4703a788e7755dfde8446f76b.png

整理不易,三连

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值