HW8

浏览: 1079
一家婚恋网站公司希望根据已注册用户的历史相亲数据,建立新用户相亲成功可能性的预测模型,数据存放在“date_data2.csv”中。

1、分析思路:

在对客户流失与否的影响因素进行模型研究之前,首先对各解释变量与被解释变量进行两变量独立性分析,以初步判断影响流失的因素,进而建立客户

流失预测模型

主要变量说明如下:

#income-月均收入(元)
#attractive-由婚恋网站评定出的个人魅力值,分值从0-100。
#assets-资产(万元)
#edueduclass-教育等级:1=小学,2=初中;3=高中,4=本科,5=硕士及以上
#Dated-是否相亲成功:1代表成功


2、作业安排:

2.1 基础知识:

1)比较逻辑回归、决策树、神经网络的算法差异。



2.2 案例解答步骤如下:

1)使用决策树、神经网络建立相亲成功预测模型并通过调节超参数进行模型调优,比较两个模型的优劣。

2)对income,attractive,assets进行分箱(5分箱)处理,用分箱后的数据建模,并比较与1)步骤中模型的表现是否有差异。
#%%
import pandas as pd

import os
os.chdir(r"E:\Python_learning\data_science\task_0529\HW8")
# In[2]:

date = pd.read_csv('date_data2.csv') # 读取已经整理好的数据
date.head()

#%%
cross_table = pd.crosstab(date.Dated,date.edueduclass, margins=True)
cross_table.head()

#%%
def percConvert(ser):
return ser/float(ser[-1])

cross_table.apply(percConvert, axis=1)

#%%
import seaborn as sns
import matplotlib.pyplot as plt
data1 = ['income','attractive','assets']
for i in data1:
print('name:',i)
sns.boxplot(x = 'Dated', y = date[i], data=date)
plt.show()

#%%
import sklearn.model_selection as cross_validation

target = date['Dated'] # 选取目标变量
data= date.ix[:, :'edueduclass'] # 选取自变量

train_data, test_data, train_target, test_target = cross_validation.train_test_split(data,target, test_size=0.4, train_size=0.6 ,random_state=12345) # 划分训练集和测试集

#%%
# 选择决策树进行建模
import sklearn.tree as tree

clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=8, min_samples_split=5) # 当前支持计算信息增益和GINI
clf.fit(train_data, train_target) # 使用训练数据建模

# 查看模型预测结果
train_est = clf.predict(train_data) # 用模型预测训练集的结果
train_est_p=clf.predict_proba(train_data)[:,1] #用模型预测训练集的概率
test_est=clf.predict(test_data) # 用模型预测测试集的结果
test_est_p=clf.predict_proba(test_data)[:,1] # 用模型预测测试集的概率
pd.DataFrame({'test_target':test_target,'test_est':test_est,'test_est_p':test_est_p}).T # 查看测试集预测结果与真实结果对比
#%%
import sklearn.metrics as metrics

print(metrics.confusion_matrix(test_target, test_est,labels=[0,1])) # 混淆矩阵
print(metrics.classification_report(test_target, test_est)) # 计算评估指标
print(pd.DataFrame(list(zip(data.columns, clf.feature_importances_)))) # 变量重要性指标


# In[20]:

#察看预测值的分布情况
red, blue = sns.color_palette("Set1", 2)
sns.distplot(test_est_p[test_target == 1], kde=False, bins=15, color=red)
sns.distplot(test_est_p[test_target == 0], kde=False, bins=15,color=blue)
plt.show()


# In[21]:


fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_est_p)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_est_p)
plt.figure(figsize=[6,6])
plt.plot(fpr_test, tpr_test, color=blue)
plt.plot(fpr_train, tpr_train, color=red)
plt.title('ROC curve')
plt.show()
print('AUC = %6.4f' %metrics.auc(fpr_test, tpr_test))
#%%
from sklearn.model_selection import GridSearchCV
from sklearn import metrics

param_grid = {
'criterion':['entropy','gini'],
'max_depth':[2,3,4,5,6,7,8],
'min_samples_split':[4,8,12,16,20,24,28]
}
clf = tree.DecisionTreeClassifier()
clfcv = GridSearchCV(estimator=clf, param_grid=param_grid,
scoring='roc_auc', cv=4)
clfcv.fit(train_data, train_target)

#%%
clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_split=4) # 当前支持计算信息增益和GINI
clf.fit(train_data, train_target) # 使用训练数据建模

#%%
# 查看模型预测结果
train_est = clfcv.predict(train_data) # 用模型预测训练集的结果
train_est_p=clfcv.predict_proba(train_data)[:,1] #用模型预测训练集的概率
test_est=clfcv.predict(test_data) # 用模型预测测试集的结果
test_est_p=clfcv.predict_proba(test_data)[:,1] # 用模型预测测试集的概率
#%%
fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_est_p)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_est_p)
plt.figure(figsize=[6,6])
plt.plot(fpr_test, tpr_test, color=blue)
plt.plot(fpr_train, tpr_train, color=red)
plt.title('ROC curve')
plt.show()
print('AUC = %6.4f' %metrics.auc(fpr_test, tpr_test))
#%%
clfcv.best_params_

#%%
import pydotplus
from IPython.display import Image
import sklearn.tree as tree

dot_data = tree.export_graphviz(
clf,
out_file=None,
feature_names=train_data.columns,
max_depth=5,
class_names=['0','1'],
filled=True
)

graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
#%%
#神经网络
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)
#%%
from sklearn.neural_network import MLPClassifier

mlp = MLPClassifier(hidden_layer_sizes=(10,),
activation='logistic', alpha=0.1, max_iter=1000)

mlp.fit(scaled_train_data, train_target)
mlp

#%%
train_predict = mlp.predict(scaled_train_data)
test_predict = mlp.predict(scaled_test_data)
# 预测概率

# In[7]:
# 计算分别属于各类的概率,取标签为1的概率
train_proba = mlp.predict_proba(scaled_train_data)[:, 1]
test_proba = mlp.predict_proba(scaled_test_data)[:, 1]
# ### 验证

# In[8]:
from sklearn import metrics

print(metrics.confusion_matrix(test_target, test_predict, labels=[0, 1]))
print(metrics.classification_report(test_target, test_predict))
# In[9]
mlp.score(scaled_test_data, test_target) # Mean accuracy

# In[10]:
fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_proba)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_proba)

plt.figure(figsize=[4, 4])
plt.plot(fpr_test, tpr_test, '')
plt.plot(fpr_train, tpr_train, '')
plt.title('ROC curve')
plt.show()

print('AUC = %6.4f' %metrics.auc(fpr_test, tpr_test))


# In[ ]:
from sklearn.model_selection import GridSearchCV
from sklearn import metrics

param_grid = {
'hidden_layer_sizes':[(10, ), (15, ), (20, ), (5, 5)],
'activation':['logistic', 'tanh', 'relu'],
'alpha':[0.001, 0.01, 0.1, 0.2, 0.4, 1, 10]
}
mlp = MLPClassifier(max_iter=1000)
gcv = GridSearchCV(estimator=mlp, param_grid=param_grid,
scoring='roc_auc', cv=4, n_jobs=-1)
gcv.fit(scaled_train_data, train_target)

#%%
gcv.best_score_
#%%
gcv.best_params_
#%%
gcv.best_estimator_
#%%
gcv.score(scaled_test_data, test_target) # Mean accuracy

#%%
mlp = MLPClassifier(hidden_layer_sizes=(5,5),
activation='tanh', alpha=0.001, max_iter=1000)
mlp.fit(scaled_train_data, train_target)
# In[39]
train_predict = mlp.predict(scaled_train_data)
test_predict = mlp.predict(scaled_test_data)
train_proba = mlp.predict_proba(scaled_train_data)[:, 1]
test_proba = mlp.predict_proba(scaled_test_data)[:, 1]
print(metrics.confusion_matrix(test_target, test_predict, labels=[0, 1]))
print(metrics.classification_report(test_target, test_predict))
# precision=0.77, recall=0.91, f1-score=0.83, support=11
# In[40]
fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_proba)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_proba)

plt.figure(figsize=[4, 4])
plt.plot(fpr_test, tpr_test, '')
plt.plot(fpr_train, tpr_train, '')
plt.title('ROC curve')
plt.show()

print('AUC = %6.4f' %metrics.auc(fpr_test, tpr_test))

推荐 0
本文由 这一秒不放弃 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册