Coggle 30 Days of ML(22年7月)


## Part1 内容介绍

在给大家分享知识的过程中,发现很多同学在学习竞赛都存在较多的问题:

  • Pandas、Numpy 处理数据不熟悉
  • Sklearn、LightGBM 模型使用不熟悉
  • 不知道如何构建特征工程、筛选特征
  • NLP模型不知道如何搭建

而上述问题都是一个竞赛选手、一个算法工程师所必备的。因此我们将从本月组织一次竞赛训练营活动,希望能够帮助大家入门数据竞赛。在活动中我们将布置具体竞赛任务,然后参与的同学们不断闯关完成,竟可能的帮助大家入门。

7月份的竞赛活动将以下两个比赛展开:

  • 糖尿病遗传风险检测挑战赛
  • 汽车领域多语种迁移学习挑战赛

2020-06-27 直播录屏:活动任务介绍

2020-07-01 直播录屏:数据分析、特征工程、BERT基础

直播代码:


## Part2 活动安排

  • 活动是免费学习活动,不会收取任何费用。
  • 请各位同学添加下面微信,并回复【竞赛学习】,即可参与。



## Part3 积分说明和奖励

为了激励各位同学完成的学习任务,将学习任务根据难度进行划分,并根据是否完成进行评分难度高中低的任务分别分数为3、2和1。在完成学习后(本次活动,截止7月24),将按照积分顺序进行评选 Top3 的学习者。

打卡链接:https://shimo.im/forms/bnWE5XKAHkQi6Ky4/fill

打卡可以写在一个地址,每次有新完成的可以重复提交打卡!

Top1的学习者将获得以下奖励

  • Coggle 竞赛专访机会
  • 《机器学习算法竞赛实战》

Top10的学习者将获得以下奖励

  • “讯飞 x Datawhale” 联合颁发的优秀选手证书。
  • Coggle 周边福利
  • Coggle 竞赛专访机会
昵称 糖尿病挑战赛 汽车多语种挑战赛 总积分
qqh 12 11 23
请叫我子源 12 9 21
valleyBeyond 12 9 21
D·尼卡 12 9 21
Mjj 12 7 19
MichstaBe_L_ 12 7 19
白金生 12 7 19
Trinitylo 12 5 17
Cary 12 5 17
LittleDream_hjy 12 5 17
zuozuo 5 11 16
若辰 12 3 15
斩 三 煞 7 7 14
不忘初心@147751***@qq.com 9 5 14
阿维 9 4 13
12 1 13
liuyang198953 12 12
Miào然 9 3 12
白金生 12 12
ivyxue16 11 11
圆脸银 7 3 10
谁谁谁 10 10
辉鸿 2 6 8
徐乜乜 7 7
钱杰 7 7
Mjj 7 7
Linzijiandevx 7 7
Ben 3 3 6
Matrix战队 5 1 6
LiamPayne 3 2 5
Amihua Lau 5 5
RylonW 5 5
月君 2 3 5
月君 4 4
本来是蒋 2 2 4
凸🐰 4 4
April 4 4
纯粹 3 3
雪山包和润包 3 3
BobM 3 3
Ada 2 2
是光。 2 2
张琳这 2 2
ivyxue16 1 1 2
hm812328 2 2
转一圈 1 1 2
rua_corgi 1 1
San 1 1
值得信赖的小海豚 1 1
佛系车队 1 1
Lstreams 1 1
刘驰宇 0 0 0
Jason Freed 0 0 0
paulsh 0 0 0
dylan24 0 0 0
小小的香辛料 0 0 0
Shea 0
wangbin221 0
真想 0
丙子年 0
欢乐马 0
Shea 0
April-伟萍 0
魔人派大星 0
王锦鲤 0
年糕 0
悟空 0
answey 0
L 0
少辉gogogo 0
catchlove666 0
冬帘 0
美滋滋 0
Sinclair 0
欧文 0
鸭鸭鸭 0
小马褂顶天立地 0
D1、pa_ 0
LYJ 0
摩天居士 0
0
Jason Freed 0
Lstreams 0
东东 0

## Part4 糖尿病遗传风险检测挑战赛

### 学习内容

本教程主要是针对糖尿病遗传风险检测挑战赛开展,将讲解数据比赛中具体使用的知识点和细节。 在本次学习中我们将学习特征工程、特征筛选和模型调参过程。

比赛报名地址:http://challenge.xfyun.cn/topic/info?type=diabetes&ch=ds22-dw-zmt05

### 赛题介绍

在这次比赛中,您需要通过训练数据集构建糖尿病遗传风险预测模型,然后预测出测试数据集中个体是否患有糖尿病,和我们一起帮助糖尿病患者解决这“甜蜜的烦恼”。对于测试数据集当中的个体,您必须预测其是否患有糖尿病(患有糖尿病:1,未患有糖尿病:0),预测值只能是整数1或者0。

训练集(比赛训练集.csv)一共有5070条数据,用于构建您的预测模型(您可能需要先进行数据分析)。数据的字段有编号、性别、出生年份、体重指数、糖尿病家族史、舒张压、口服耐糖量测试、胰岛素释放实验、肱三头肌皮褶厚度、患有糖尿病标识(最后一列),您也可以通过特征工程技术构建新的特征。

测试集(比赛测试集.csv)一共有1000条数据,用于验证预测模型的性能。数据的字段有编号、性别、出生年份、体重指数、糖尿病家族史、舒张压、口服耐糖量测试、胰岛素释放实验、肱三头肌皮褶厚度。

### 打卡汇总

任务名称 难度
任务1:比赛报名 低、1
任务2:比赛数据分析 低、1
任务3:逻辑回归尝试 低、1
任务4:特征工程 中、2
任务5:特征筛选 中、2
任务6:高阶树模型 中、2
任务7:多折训练与集成 高、3
  • 任务1:报名比赛
import pandas as pd

train_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk')
test_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛测试集.csv', encoding='gbk')

print(train_df.shape, test_df.shape)
print(train_df.dtypes, test_df.dtypes)
  • 任务2:比赛数据分析
    • 步骤1:统计字段的缺失值,计算缺失比例;
      • 通过缺失值统计,训练集和测试集的缺失值分布是否一致?
      • 通过缺失值统计,有没有缺失比例很高的列?
    • 步骤2:分析字段的类型;
      • 有多少数值类型、类别类型?
      • 你是判断字段类型的?
      • 在博客中通过文字写出你的判断;
    • 步骤3:计算字段相关性;
      • 通过.corr()计算字段之间的相关性;
      • 有哪些字段与标签的相关性最高?
      • 尝试使用其他可视化方法将字段 与 标签的分布差异进行可视化;
# 缺失值计算
train_df.isnull().mean(0)
test_df.isnull().mean(0)

# 相关性计算
train_df.corr()

train_df['性别'].value_counts().plot(kind='barh')

sns.countplot(x='患有糖尿病标识', hue='性别', data=train_df)

sns.boxplot(y='出生年份', x='患有糖尿病标识', hue='性别', data=train_df)

sns.violinplot(y='体重指数', x='患有糖尿病标识', hue='性别', data=train_df)
  • 任务3:逻辑回归尝试

    • 步骤1:导入sklearn中的逻辑回归;
    • 步骤2:使用训练集和逻辑回归进行训练,并在测试集上进行预测;
    • 步骤3:将步骤2预测的结果文件提交到比赛,截图分数;
    • 步骤4:将训练集20%划分为验证集,在训练部分进行训练,在测试部分进行预测,调节逻辑回归的超参数;
    • 步骤5:如果精度有提高,则重复步骤2和步骤3;如果没有提高,可以尝试树模型,重复步骤2、3;
  • 任务4:特征工程(使用pandas完成)

    • 步骤1:统计每个性别对应的【体重指数】、【舒张压】平均值
    • 步骤2:计算每个患者与每个性别平均值的差异;
    • 步骤3:在上述基础上将训练集20%划分为验证集,使用逻辑回归完成训练,精度是否有提高?
    • 步骤4:思考字段含义,尝试新的特征,将你的尝试写入博客;
  • 任务5:特征筛选

    • 步骤1:使用树模型完成模型的训练,通过特征重要性筛选出Top5的特征;
    • 步骤2:使用筛选出的特征和逻辑回归进行训练,在验证集精度是否有提高?
    • 步骤3:如果有提高,为什么?如果没有提高,为什么?
    • 步骤4:将你的尝试写入博客;
  • 任务6:高阶树模型

    • 步骤1:安装LightGBM,并学习基础的使用方法;
    • 步骤2:将训练集20%划分为验证集,使用LightGBM完成训练,精度是否有提高?
    • 步骤3:将步骤2预测的结果文件提交到比赛,截图分数;
    • 步骤4:尝试调节搜索LightGBM的参数;
    • 步骤5:将步骤4调参之后的模型从新训练,将最新预测的结果文件提交到比赛,截图分数;
  • 任务7:多折训练与集成

    • 步骤1:使用KFold完成数据划分;
    • 步骤2:使用StratifiedKFold完成数据划分;
    • 步骤3:使用StratifiedKFold配合LightGBM完成模型的训练和预测
    • 步骤4:在步骤3训练得到了多少个模型,对测试集多次预测,将最新预测的结果文件提交到比赛,截图分数;
    • 步骤5:使用交叉验证训练5个机器学习模型(svm、lr等),使用stacking完成集成,将最新预测的结果文件提交到比赛,截图分数;

### 基础思路(0.93分数)

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import make_pipeline

train_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk')
test_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛测试集.csv', encoding='gbk')

dict_糖尿病家族史 = {
    '无记录': 0,
    '叔叔或姑姑有一方患有糖尿病': 1,
    '叔叔或者姑姑有一方患有糖尿病': 1,
    '父母有一方患有糖尿病': 2
}

train_df['糖尿病家族史'] = train_df['糖尿病家族史'].map(dict_糖尿病家族史)
test_df['糖尿病家族史'] = test_df['糖尿病家族史'].map(dict_糖尿病家族史)

train_df['舒张压'].fillna(89, inplace=True)
test_df['舒张压'].fillna(89, inplace=True)

# 构建模型
model = make_pipeline(
    MinMaxScaler(),
    DecisionTreeClassifier()
)
model.fit(train_df.drop(['编号', '患有糖尿病标识'], axis=1), train_df['患有糖尿病标识'])

# 模型预测
test_df['label'] = model.predict(test_df.drop(['编号'], axis=1))
test_df.rename({'编号': 'uuid'}, axis=1)[['uuid', 'label']].to_csv('submit.csv', index=None)

### 进阶思路(0.96分数)

import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.model_selection import KFold
import lightgbm as lgb

# 读取数据
train_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛训练集.csv', encoding='gbk')
test_df = pd.read_csv('./糖尿病遗传风险预测挑战赛公开数据/比赛测试集.csv', encoding='gbk')


# 基础特征工程
train_df['体重指数_round'] = train_df['体重指数'] // 10
test_df['体重指数_round'] = train_df['体重指数'] // 10

train_df['口服耐糖量测试'] = train_df['口服耐糖量测试'].replace(-1, np.nan)
test_df['口服耐糖量测试'] = test_df['口服耐糖量测试'].replace(-1, np.nan)

dict_糖尿病家族史 = {
    '无记录': 0,
    '叔叔或姑姑有一方患有糖尿病': 1,
    '叔叔或者姑姑有一方患有糖尿病': 1,
    '父母有一方患有糖尿病': 2
}

train_df['糖尿病家族史'] = train_df['糖尿病家族史'].map(dict_糖尿病家族史)
test_df['糖尿病家族史'] = test_df['糖尿病家族史'].map(dict_糖尿病家族史)

train_df['糖尿病家族史'] = train_df['糖尿病家族史'].astype('category')
test_df['糖尿病家族史'] = train_df['糖尿病家族史'].astype('category')

train_df['性别'] = train_df['性别'].astype('category')
test_df['性别'] = train_df['性别'].astype('category')

train_df['年龄'] = 2022 - train_df['出生年份']
test_df['年龄'] = 2022 - test_df['出生年份']

train_df['口服耐糖量测试_diff'] = train_df['口服耐糖量测试'] - train_df.groupby('糖尿病家族史').transform('mean')['口服耐糖量测试']
test_df['口服耐糖量测试_diff'] = test_df['口服耐糖量测试'] - test_df.groupby('糖尿病家族史').transform('mean')['口服耐糖量测试']


# 模型交叉验证
def run_model_cv(model, kf, X_tr, y, X_te, cate_col=None):
    train_pred = np.zeros( (len(X_tr), len(np.unique(y))) )
    test_pred = np.zeros( (len(X_te), len(np.unique(y))) )

    cv_clf = []
    for tr_idx, val_idx in kf.split(X_tr, y):
        x_tr = X_tr.iloc[tr_idx]; y_tr = y.iloc[tr_idx]

        x_val = X_tr.iloc[val_idx]; y_val = y.iloc[val_idx]

        call_back = [
            lgb.early_stopping(50),
        ]
        eval_set = [(x_val, y_val)]
        model.fit(x_tr, y_tr, eval_set=eval_set, callbacks=call_back, verbose=-1)

        cv_clf.append(model)

        train_pred[val_idx] = model.predict_proba(x_val)
        test_pred += model.predict_proba(X_te)

    test_pred /= kf.n_splits
    return train_pred, test_pred, cv_clf

clf = lgb.LGBMClassifier(
    max_depth=3, 
    n_estimators=4000, 
    n_jobs=-1, 
    verbose=-1,
    verbosity=-1,
    learning_rate=0.1,
)

train_pred, test_pred, cv_clf = run_model_cv(
    clf, KFold(n_splits=5),
    train_df.drop(['编号', '患有糖尿病标识'], axis=1),
    train_df['患有糖尿病标识'],
    test_df.drop(['编号'], axis=1),
)

print((train_pred.argmax(1) == train_df['患有糖尿病标识']).mean())
test_df['label'] = test_pred.argmax(1)
test_df.rename({'编号': 'uuid'}, axis=1)[['uuid', 'label']].to_csv('submit.csv', index=None)

### 打卡要求

注:

  • 需要所有的任务可以写在一个博客内
  • 推荐在打卡过程中加入思考过程,可以加入尝试&资料记录

## Part5 汽车领域多语种迁移学习挑战赛

### 学习内容

本教程主要是针对汽车领域多语种迁移学习挑战赛开展,将讲解数据比赛中具体使用的知识点和细节。 在本次学习中我们将学习文本分类和关键词提取。

比赛报名地址:http://challenge.xfyun.cn/topic/info?type=car-multilingual&ch=ds22-dw-zmt05

### 赛题介绍

国内车企为提升产品竞争力、更好走向海外市场,提出了海外市场智能交互的需求。但世界各国在“数据安全”上有着严格法律约束,要做好海外智能化交互,本土企业面临的最大挑战是数据缺少。本赛题要求选手通过NLP相关人工智能算法来实现汽车领域多语种迁移学习。

本次迁移学习任务中,讯飞智能汽车BU将提供较多的车内人机交互中文语料,以及少量的中英、中日、中阿平行语料作为训练集,参赛选手通过提供的数据构建模型,进行意图分类及关键信息抽取任务,最终使用英语、日语、阿拉伯语进行测试评判。

1.初赛

  • 训练集:中文语料30000条,中英平行语料1000条,中日平行语料1000条
  • 测试集A:英文语料500条,日文语料500条
  • 测试集B:英文语料500条,日文语料500条

2.复赛

  • 训练集:中文语料同初赛,中阿拉伯平行语料1000条
  • 测试集A:阿拉伯文语料500条
  • 测试集B:阿拉伯文语料500条
  1. 本模型依据提交的结果文件,采用accuracy进行评价。
  • 意图分类accuracy = 意图正确数目 / 总数据量
  • 关键信息抽取accuracy = 关键信息完全正确数目 / 总数据量

### 打卡汇总

任务名称 难度
任务1:比赛报名 低、1
任务2:文本分析与文本分词 低、1
任务3:TFIDF与文本分类 低、1
任务4:正则表达式 中、2
任务5:BERT模型入门 中、2
任务6:BERT文本分类 中、2
任务7:BERT实体抽取 中、2
import pandas as pd

train_cn = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/中文_trian.xlsx')
train_ja = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/日语_train.xlsx')
train_en = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/英文_train.xlsx')
test_ja = pd.read_excel('testA.xlsx', sheet_name='日语_testA')
test_en = pd.read_excel('testA.xlsx', sheet_name='英文_testA')
  • 任务2:文本分析与文本分词
    • 步骤1:使用jieba对中文进行分词;
    • 步骤2:使用negisa对日语进行分词;
import jieba
import jieba.posseg as pseg

words = jieba.lcut("阿水是一个好同志。")
print(words)
# ['阿水', '是', '一个', '好', '同志', '。']

words = pseg.lcut("阿水是一个好同志。")
# [pair('阿水', 'nr'), pair('是', 'v'), pair('一个', 'm'), pair('好', 'a'), pair('同志', 'n'), pair('。', 'x')]
# https://github.com/taishi-i/nagisa
import nagisa

text = 'Pythonで簡単に使えるツールです'
words = nagisa.tagging(text)
print(words)
# Python/名詞 で/助詞 簡単/形状詞 に/助動詞 使える/動詞 ツール/名詞 です/助動詞

print(words.words)
# ['Python', 'で', '簡単', 'に', '使える', 'ツール', 'です']

### 基础思路(0.61分数)

import pandas as pd # 读取文件
import numpy as np # 数值计算
import nagisa # 日文分词
from sklearn.feature_extraction.text import TfidfVectorizer # 文本特征提取
from sklearn.linear_model import LogisticRegression # 逻辑回归
from sklearn.pipeline import make_pipeline # 组合流水线

# 读取数据
train_cn = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/中文_trian.xlsx')
train_ja = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/日语_train.xlsx')
train_en = pd.read_excel('汽车领域多语种迁移学习挑战赛初赛训练集/英文_train.xlsx')

test_ja = pd.read_excel('testA.xlsx', sheet_name='日语_testA')
test_en = pd.read_excel('testA.xlsx', sheet_name='英文_testA')

# 文本分词
train_ja['words'] = train_ja['原始文本'].apply(lambda x: ' '.join(nagisa.tagging(x).words))
train_en['words'] = train_en['原始文本'].apply(lambda x: x.lower())

test_ja['words'] = test_ja['原始文本'].apply(lambda x: ' '.join(nagisa.tagging(x).words))
test_en['words'] = test_en['原始文本'].apply(lambda x: x.lower())

# 训练TFIDF和逻辑回归
pipline = make_pipeline(
    TfidfVectorizer(),
    LogisticRegression()
)
pipline.fit(
    train_ja['words'].tolist() + train_en['words'].tolist(),
    train_ja['意图'].tolist() + train_en['意图'].tolist()
)

# 模型预测
test_ja['意图'] = pipline.predict(test_ja['words'])
test_en['意图'] = pipline.predict(test_en['words'])
test_en['槽值1'] = np.nan
test_en['槽值2'] = np.nan

test_ja['槽值1'] = np.nan
test_ja['槽值2'] = np.nan

# 写入提交文件
writer = pd.ExcelWriter('submit.xlsx')
test_en.drop(['words'], axis=1).to_excel(writer, sheet_name='英文_testA', index=None)
test_ja.drop(['words'], axis=1).to_excel(writer, sheet_name='日语_testA', index=None)
writer.save()
writer.close()

### 打卡要求

注:

  • 需要所有的任务可以写在一个博客内
  • 推荐在打卡过程中加入思考过程,可以加入尝试&资料记录


© 2019-2023 coggle.club 版权所有     京ICP备20022947    京公网安备 11030102010643号