import warnings from sklearn import preprocessing from sklearn.externals import joblib from sklearn.svm import SVC from sklearn import tree from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression warnings.filterwarnings(“ignore”)
导入数据分析库,这个库提供高性能易用的数据类型和分析工具
它提供一种数据结构:Dataframe,这个数据结构是一种类似于表的结构
import pandas as pd
from sklearn import datasets, model_selection, naive_bayes
导入科学计算工具,这个库支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
import numpy as np #导入csr矩阵 from scipy.sparse import csr_matrix #导入训练集验证集分割工具 from sklearn.model_selection import train_test_split
此处从sklearn库中导入算法,请参赛选手自行选择算法
从sklearn库中导入一个模块,该模块用于绘制roc-auc曲线
from sklearn.metrics import roc_auc_score #导入两个作图库
import seaborn as sns
导入作图库下的一个模块,这个模块中是一些命令样式函数,
例如创建图形、在图行里创建绘图区、在绘图区画线、用标签装饰图形等
import matplotlib.pyplot as plt
1.2 样本数据统计分析
一般情况下,我们在做机器学习任务或其他数据相关的任务时,首先要对样本数据有一定的了解,
比如样本数量、正负样本是否均衡等维度,这些维度会影响后续的算法选择以及模型的性能,
所以我们在这里需要先了解一下样本总数和正样本(男性用户)和负样本(女性用户)的比例。
下面的代码主要功能是对男女性别的比例和平均每位用户安装的app数量进行统计,
df = pd.read_csv ( ‘/Users/zhinian/Downloads/dataRaceData/gender_app.csv’ , encoding = ‘utf-8’ )
def label_vis():
读取样本数据
df = pd.read_csv('/Users/zhinian/Downloads/dataRaceData/gender_app.csv',encoding='utf-8')
由于样本数据的特点,每一行对应了一个用户在某一时间段内使用某个app的次数,这就会导致样本数据中的id出现重复,
所以在这里需要对id一列进行去重处理
df = df.drop_duplicates('id')
print(df)
统计id数量
count = df['id'].count()
#输出用户总数
# print (count)
#分隔
print (’—’)
#取到id和性别两个属性 df_a = df[[‘id’,‘label’]]
print(df_a)
# 统计男性用户数和女性用户数
print (df_a[df_a.label==0].count())
print (df_a[df_a.label==1].count())
#分隔
print (’—’)
# 计算男女性别比例
print (df_a[df_a.label1].count()/(df_a[df_a.label0]).count())
# 1.3 样本数据表结构转换
# 通常情况下,在机器学习任务中,样本数据中的每一行数据都应该包含了一个样本的全部特征,
# 也就是说在本次大赛中,一行数据应该包含了一个用户所使用的全部app的信息。
# 但我们的样本数据中每一个样本只对应了一个app及其使用频率,
# 所以我们要对样本数据的表结构进行转换。
# 转换的思路就是将app作为特征,freq(使用频率)作为特征值填充到用户对应的app下,
#创建稀疏矩阵
def create_sparse_matrix(): df = pd.read_csv(’/Users/zhinian/Downloads/dataRaceData/gender_app.csv’,encoding=‘utf-8’)
#user_id去重,得到全部用户id的列表
id_list = list(sorted(df['id'].unique()))
#app去重,得到全部app名称的列表
app_list = list(sorted(df['app'].unique()))
print(app_list)
#将用户id作为矩阵行
row = list(df['id'].astype('category').cat.codes)
# print(row)
# #将app作为矩阵列
col = list(df['app'].astype('category').cat.codes)
print(col)
# #将app的使用频率作为矩阵值
data = df['freq'].copy(deep=True)
data =data.tolist()
# print(len(data))
#去重、编号、排序
label_df = df[['id', 'label']].drop_duplicates().set_index('id').sort_values(by='id')
data.extend(list(label_df['label']))
row.extend(list(label_df.index))
col.extend(list(np.zeros(label_df.shape[0])+1))
#此时将行列值拼接起来就可以得到转换后的稀疏矩阵
print(len(data))
print(len(row))
print(len(col))
print (csr_matrix((data, (row, col))))
print(label_df.shape[0])
#返回创建的csr矩阵和app列表
return csr_matrix((data, (row, col)), shape=(len(id_list), len(app_list) + 1)),app_list
1
2
3
4
5
6
7
8
# 1.4 模型验证
# 在上一节中我们已经完成了样本数据表结构的转换并以csr稀疏矩阵的形式保存了数据,
# 这一步我们要选择算法构建模型并对模型进行验证。
# 验证的方式就是将样本数据划分成训练集和验证集,训练集用于学习规则,验证集用于验证结果
# 注:算法及参数由参赛者自行选择、调整
def validate():
#取到create_sparse_matrix()中创建的稀疏矩阵
sparse_matrix = create_sparse_matrix()[0]
# sparse_matrix=preprocessing.scale(sparse_matrix2,with_mean=False)
#划分训练集和验证集,随机数种子、训练集和验证集的比例由用户自行选择
train_df, test_df = train_test_split(sparse_matrix , random_state=2)
label_index = sparse_matrix.shape[1] - 1
#train_df[:, label_index] 取所有行,label列 train_y = train_df[:, 0].todense()
test_y = test_df[:, 0].todense()
# 取所有行,0-label中间的所有列
# train_df[:, 0:label_index]
train_x = train_df[:, 1:label_index+1].todense()
test_x = test_df[:, 1:label_index+1].todense()
model = RandomForestClassifier()
model.fit(train_x,train_y)
rfc_prediction = rfc_clf.predict(test_data)
#选择算法:此处由参赛者自行选择算法,调整参数
#训练
#请参赛者根据自己选择的模型计算概率并输出测试集y的AUC得分 predicted = model.predict(test_x) accruacy = np.mean(predicted == test_y) print(accruacy)
#返回test_y及概率
return test_y, predicted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.5 绘制模型的roc曲线
def plot_roc_curve():
#导入模块
from sklearn import metrics
#用验证的模型绘图
test_y, pred_y = validate()[0],validate()[1]
#fpr,tpr:即FP和TP
fpr, tpr, threshold = metrics.roc_curve(test_y,pred_y )
roc_auc = metrics.auc(fpr,tpr)
# method I: plt
import matplotlib.pyplot as plt
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
#注:b表示曲线使用蓝色,可以调整 plt.legend(loc = ‘lower right’) #显示图例,loc参数可以调整 plt.plot([0, 1], [0, 1],‘r–’) #r红色,–表示虚线样式 plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel(‘True Positive Rate’) plt.xlabel(‘False Positive Rate’) plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1.6 模型持久化
# 在1.5中我们构建并验证了模型,通过AUC指数得分及ROC曲线是否平滑可知此次训练得到的模型性能好坏,
# 接下来我们就要将模型持久化到本地,这样当我们需要对其他待遇测数据进行性别判定时就可以直接使用该模型进行预测。
class Model_Wrapper: def init(self): self.model = None self.app_dict = None
def persist_final_model(): #从sklearn库中导入模型持久化模块 from sklearn.externals import joblib sparse_matrix, app_list = create_sparse_matrix()[0],create_sparse_matrix()[1] #这里填入调参后的算法 # print(app_list) sparse_matrix = sparse_matrix.A model = RandomForestClassifier() label_index = sparse_matrix.shape[1] - 1 y = sparse_matrix[:, 0] X = sparse_matrix[:, 1:label_index+1] model.fit(pd.DataFrame(X), pd.DataFrame(y)) model_detail = Model_Wrapper() model_detail.model = model model_detail.app_dict = {app:i for i,app in enumerate(app_list)} joblib.dump(model , ‘/Users/zhinian/Downloads/dataRaceData/course_gender.pkl’)
label_vis() create_sparse_matrix() validate() plot_roc_curve() persist_final_model()