中移集成首届OneCity编程大赛Baseline分享
机缘巧合在DC竞赛上看到了这个比赛,这个编程比赛正是数据类算法比赛,主要是自然语言处理相关的文本多分类任务,老肥我从来没有学习过这NLP领域相关的知识,正好借这个比赛学习充电,在此分享一个简单的baseline方案,比赛地址文末阅读原文即可直达。
赛事介绍
比赛数据
Baseline方案
train_df = pd.read_csv('answer_train.csv')
lb = LabelEncoder()
train_df['label'] = lb.fit_transform(train_df['label'])
test_df = pd.read_csv('submit_example_test1.csv')
test_df.drop('label', axis=1, inplace=True)
df = pd.concat([train_df, test_df], axis=0)
df['file'] = df['filename'].apply(lambda x: x.split('.')[0][6:].replace('_', ''))
接着用jieba分词,并将每个词进行编号处理,得到vocab词典。
cw = lambda x: list(jieba.cut(x))
df['words'] = df['file'].apply(cw)
tokenizer=Tokenizer()
tokenizer.fit_on_texts(df['words'])
vocab=tokenizer.word_index
把句子转换成词索引序列,并对部分序列进行补长,构造一个简单的多层卷积神经网络,使用embedding层将每个词编码转换成词向量,采取常规的交叉熵损失、adam优化器进行五折交叉验证,取五折的平均值作为最后测试集的预测概率以保证模型的稳定性。
oof = np.zeros(len(X_train))
predictions = np.zeros((len(X_test), 20))
KF = StratifiedKFold(n_splits=5, shuffle=True, random_state=2020)
for fold_, (trn_idx, val_idx) in enumerate(KF.split(X_train.values, y_train.values)):
print("fold n°{}".format(fold_))
print('trn_idx:',trn_idx)
print('val_idx:',val_idx)
X_tr = X_train.iloc[trn_idx]
X_val = X_train.iloc[val_idx]
X_train_word_ids = tokenizer.texts_to_sequences(X_tr)
X_valid_word_ids = tokenizer.texts_to_sequences(X_val)
X_test_word_ids = tokenizer.texts_to_sequences(X_test)
X_train_padded_seqs=pad_sequences(X_train_word_ids,maxlen=30)
X_valid_padded_seqs=pad_sequences(X_valid_word_ids,maxlen=30)
X_test_padded_seqs=pad_sequences(X_test_word_ids, maxlen=30)
y_tr = y_train.iloc[trn_idx]
y_tr = keras.utils.to_categorical(y_tr, num_classes=20)
y_val = y_train.iloc[val_idx]
y_val = keras.utils.to_categorical(y_val, num_classes=20)
model = NN()
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(X_train_padded_seqs, y_tr, epochs=50, batch_size=1024, validation_data=(X_valid_padded_seqs, y_val), callbacks=[ES])
oof[val_idx] = model.predict_classes(X_valid_padded_seqs)
temp = model.predict_proba(X_test_padded_seqs)
predictions[:] += temp
最终该baseline方案可以获得超过0.96的线上分数。显然,改进的方案有很多,我们可以采用出色的文本分类模型来改进准确率,也可以通过使用表格文件的文本内容来增强模型的学习能力与泛化能力以提升准确率。
完整的代码我已经上传,在后台回复「baseline」即可。
——END——
扫码二维码
获取更多精彩
老肥码码码
评论