栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【阿里云天池】机器学习学习赛-测一测你的一见钟情程度

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【阿里云天池】机器学习学习赛-测一测你的一见钟情程度

AI 初学者,刚刚接触机器学习不久,记录一下自己的成长历程,希望多年之后回首,会感谢现在努力的自己。 

历经 8 个星期的学习,基本学习完了西瓜书上的 10 个重要模型,首次接触机器学习比赛,选择了阿里云天池上的学习赛:测一测你的一见钟情程度来进行学习比赛流程,baseline 选择的是天池该比赛论坛中置顶的逻辑回归模型,预测准确率为 83%。

首先,引入过程中需要使用的包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import imblearn as ibl

pandas、numpy 是机器学习中常用的数据处理包,matplotlib 是 Python 中常用的实现可视化的画图包,而 seaborn 则是基于 matplotlib 的画图包,能够画出比 matplotlib 更加丰富的可视化图像,帮助更清晰的理解数据特征,而 imblearn 包则能处理采样的不平衡,让机器学习结果更加准确。其中,pandas、numpy、matplotlib、seaborn、sklearn 已经包含在 Anaconda 环境中,而 imbalanced-learn 则需要额外安装。

使用 pandas 读入数据之后分析数据的组成,查看是否有空缺值以及空缺值占比为多少,一般来说都会有一些空缺值,空缺值占比过多的特征不太适合拿来做为学习特征

missing_percent = data.isnull().sum() * 100 / len(data)
print(missing_percent.sort_values())

查看完空缺值占比情况之后对比较明显的几个特征进行一个可视化,看一下该特征对学习结果的影响情况,这里选择了查看相亲中脱单比例与性别、年龄的相关关系并进行可视化

# 第一张图:通过该活动成功脱单的人
plt.subplot(1, 2, 1)
groupSize_matched = data.match.value_counts().values
signs = ['Single:' + str(round(groupSize_matched[0] * 100 / sum(groupSize_matched), 2)) + '%', 'Matched:' + str(round
        (groupSize_matched[1] * 100 /sum(groupSize_matched), 2)) + '%']
plt.pie(groupSize_matched, labels = signs)
# 第二张图:女生中成功脱单的人与男生中成功脱单的人
plt.subplot(1, 2, 2)
groupSize_genderMatched = data[data.match == 1].gender.value_counts().values
maleMatchedPercent = groupSize_genderMatched[0] * 100 / sum(groupSize_genderMatched)
femaleMatchedPercent = groupSize_genderMatched[1] * 100 / sum(groupSize_genderMatched)
signs = ['Male:' + str(round(maleMatchedPercent, 2)) + '%', 'Female:' + str(round(femaleMatchedPercent, 2)) + '%']
plt.pie(groupSize_genderMatched, labels = signs)
# plt.savefig('Figure0.png')
plt.subplot(1, 1, 1)
# 参加该活动的人的年龄分布情况
age = data[np.isfinite(data['age'])]['age']
plt.hist(age, bins = 35)
plt.xlabel('Age')
plt.ylabel('Frequency')

 

简单处理完这些数据特征之后如何选取后续的特征进行模型的训练和预测,可以计算各特征之间的相关系数(使用 corr 函数计算相关系数) ,然后使用 seaborn 包画出热力图,通过查找 match 特征(因为这里我们需要预测参加活动的对象是否 match 成功)和其他特征的相关系数(可以看热力图中比较亮和比较暗的部分,分别是成正相关和负相关),该题目模型的热力图如下:

 画出热力图的代码如下:

# 画出热力图分析各特征相关性
date_data = data[['iid', 'gender', 'condtn', 'round', 'position', 'match', 'int_corr', 'samerace', 'age_o', 'race_o',
                  'pf_o_att', 'dec_o', 'field_cd', 'mn_sat', 'tuition', 'race', 'imprace', 'from', 'zipcode', 'income',
                  'goal', 'career_c', 'sports', 'tvsports', 'exercise', 'dining', 'art', 'hiking', 'gaming', 'clubbing',
                  'reading', 'tv', 'theater', 'movies', 'concerts', 'music', 'shopping', 'yoga', 'exphappy',
                  'expnum', 'attr1_1', 'sinc1_1', 'intel1_1', 'fun1_1', 'amb1_1', 'shar1_1', 'attr2_1', 'sinc2_1',
                  'fun2_1', 'shar2_1', 'attr3_1', 'sinc3_1', 'intel3_1', 'fun3_1', 'amb3_1', 'attr4_1', 'sinc4_1',
                  'intel4_1', 'fun4_1', 'amb4_1', 'shar4_1', 'attr5_1', 'sinc5_1','intel5_1', 'fun5_1', 'amb5_1']]
plt.subplots(figsize = (25, 20))
corr = date_data.corr()
sb.heatmap(corr, xticklabels = corr.columns.values, yticklabels = corr.columns.values)
# plt.savefig('Heatmap.png')

通过对热力图的分析这次我选定 年龄、性别、职业、外观吸引力、聪明程度、幽默程度、分享欲、真诚、目标、民族、地区、对音乐的喜好程度、对运动的喜好程度 作为训练特征进行模型的训练。

特征选定完毕之后下一步便是训练模型,baseline 使用的模型是逻辑回归模型,达到了 83% 的正确率,此处我选择 sklearn 中提供的神经网络模型(sklearn.neural_network.MLPClassifier)作为机器学习模型,经过一系列的调参优化,最终能达到 90% 的预测准确率,相对选定的 baseline 准确率高出近 7 个点,基本达成目标。机器学习神经网络模型的代码如下:

# 构建模型,使用神经网络
model = MLPClassifier(solver = 'adam', activation = 'tanh', hidden_layer_sizes = (256, 512, 512, 256))
model.fit(x_train, y_train)
predict = model.predict(x_test)
print('神经网络预测结果:n', predict)
print('模型评价:n', classification_report(predict, y_test))
acc_per = 0
y_test = np.array(y_test)
for i in range(len(y_test)):
    if y_test[i][0] == predict[i]:
        acc_per += 1
acc_per = acc_per * 100 / len(y_test)
print('预测准确率:%d%%'%acc_per)
# 使用训练出来的模型进行预测
# 读取预测数据集
pred_data = pd.read_csv('/Users/liuyuanxi/学习/华为智能基座/huawei-smart-base-learning/一见钟情指数/数据集/speed_dating_test.csv'
                        , encoding = 'UTF-8')
print('预测集数据:', pred_data)
choice_pred_data = pred_data[['age_o', 'gender', 'attr_o', 'intel_o', 'fun_o', 'amb_o', 'shar_o', 'sinc_o',
                              'uid', 'music', 'sports', 'goal', 'race_o', 'position']]
# 处理缺失值
# choice_pred_data.dropna(inplace = True)
choice_pred_data = choice_pred_data.fillna(axis = 1, method = 'ffill')
x_pred = choice_pred_data[['age_o', 'gender', 'attr_o', 'intel_o', 'fun_o', 'amb_o', 'shar_o', 'sinc_o', 'music'
                           , 'sports', 'goal', 'race_o', 'position']]
y_pred = model.predict(x_pred)
print('预测结果:n', y_pred)
# 将预测结果写入 CSV 文件
predict_result = pd.Dataframe({'uid': choice_pred_data['uid'], 'match': y_pred}, dtype = int)
predict_result.to_csv('predict_result.csv', index = False, sep = ',')

值得注意的是,对于数据集中出现的空缺值,我采用了 pandas 包中提供的 dropna() 函数丢弃掉训练集中的空缺值,以及 fillna() 函数将预测集中的空缺值补充完整。

以上就是这次学习赛的整体流程和思想梳理以及代码的实现过程,小白刚刚接触 AI 两个月,还在初级阶段学习,肯定还有许多值得提高的地方或许也会有很多理解错误的地方,希望大家多多包涵

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664455.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号