数据集及源码https://github.com/JCATHoney/python-data-analysis
一、问题描述
一家婚恋网站公司希望根据已注册用户的历史相亲数据,建立新用户相亲成功可能性的预测模型,数据存放在“date_data2.csv”中。
二、数据集
#income-月均收入(元)
#attractive-由婚恋网站评定出的个人魅力值,分值从0-100。
#assets-资产(万元)
#edueduclass-教育等级:1=小学,2=初中;3=高中,4=本科,5=硕士及以上
#Dated-是否相亲成功:1代表成功
三、解题步骤
-
使用决策树、神经网络建立相亲成功预测模型并通过调节超参数进行模型调优,比较两个模型的优劣。
-
对income,attractive,assets进行分箱(5分箱)处理,用分箱后的数据建模,并比较与1)步骤中模型的表现是否有差异。
3.1疑问点记录
- predict_proba
返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行的概率和为1
train_est_p=clf.predict_proba(train_data)[:,1]#每个样本预测为1(成功)的概率
- 极差标准化-MinMaxScaler
神经网络算法必须先将数据进行极差标准化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(train_data)
scaled_train_data = scaler.transform(train_data)
scaled_test_data = scaler.transform(test_data)
- 分箱操作
分为两类:等深分箱(qcut)等宽分箱(cut)
-
等深分箱 :每箱的样本量基本一致(有点分位数的意思)
以数量为划分标准(100份数据分5个箱子,每个差不多20份数据),返回的是区间。 -
等宽分箱 :样本量之间有相同的宽度,自定义划分边界,并且返回等级标签。
eg:假如我们有一组学生成绩,我们需要将这些成绩分为不及格(0-59)、及格(60-70)、良(71-85)、优(86-100)这几组
tips:qcut和cut结合使用,用qcut把握数据分布情况,来确定cut的边界。因为后续建模不能用一个区间来计算,要转换为等级标签
处理连续变量,进项等深分箱
data0['income'] = pd.qcut(data0.income,5) # 将income字段切分为数量(大致)相等的5段
data0['attractive'] = pd.qcut(data0.attractive,5)
data0['assets'] = pd.qcut(data0.assets,5)
#%%
data0['Dated'].groupby(data0['income']).agg(['count', 'mean'])
'''
count mean
income
(2999.999, 4500.0] 24 0.125000
(4500.0, 6500.0] 21 0.380952
(6500.0, 9000.0] 20 0.650000
(9000.0, 11800.0] 15 0.600000
(11800.0, 34000.0] 20 0.850000
count mean
attractive
(0.999, 21.0] 23 0.304348
(21.0, 39.5] 23 0.521739
(39.5, 65.5] 29 0.482759
(65.5, 79.0] 7 0.571429
(79.0, 99.5] 18 0.722222
count mean
assets
(3.999, 25.0] 23 0.000000
(25.0, 52.6] 17 0.058824
(52.6, 94.0] 26 0.576923
(94.0, 145.0] 15 1.000000
(145.0, 486.0] 19 1.000000
'''
#%%
bins1 = [0, 4500, 6500, 9000, 11800, 35000]
bins2 = [0, 21, 40, 65, 80, 100]
bins3 = [0, 25, 53, 94, 145, 490]
data0['income'] = pd.cut(data0['income'],bins1,labels=False)
data0['attractive'] = pd.cut(data0['attractive'],bins2,labels