Python数据科学-技术详解与商业实践-第六讲作业(数据见附件,预习视频见文末)

浏览: 2511

1、背景介绍:

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

2、主要变量说明如下

#income-月均收入(元)

#attractive-由婚恋网站评定出的个人魅力值,分值从0-100。

#assets-资产(万元)

#edueduclass-教育等级:1=小学,2=初中;3=高中,4=本科,5=硕士及以上

#Dated-是否相亲成功:1代表成功

3、作业安排:

3.1 基础知识:

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

3.2 案例解答步骤如下:

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

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

# coding: utf-8
# # 决策树
# In[1]:
#get_ipython().magic('matplotlib inline')
import os
import pandas as pd
os.chdir(r'D:\Python_Training\script_Python\10ANN\HW')
#pd.set_option('display.max_columns', None)
# In[2]:
data = pd.read_csv('date_data2.csv', skipinitialspace=True)
data.head()
# In[3]:
target = data['Dated']
data = data.ix[:, :4]
data.head()
# 1)使用决策树、神经网络建立相亲成功预测模型并通过调节超参数进行模型调优,比较两个模型的优劣。
#1.1# 决策树
#%%
#网格搜索参数
#%%
import sklearn.tree as tree
from sklearn.model_selection import GridSearchCV
from sklearn import metrics
#%%
import sklearn.model_selection as cross_validation
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) # 划分训练集和测试集
#%%
param_grid = {
    'criterion':['entropy','gini'],
    'max_depth':[2,3,4],
    'min_samples_split':[2,4,6,8,10] 
}
clf = tree.DecisionTreeClassifier()
clfcv = GridSearchCV(estimator=clf, param_grid=param_grid, 
                   scoring='roc_auc', cv=4)
clfcv.fit(train_data, train_target)
#%%
clfcv.best_params_
#%%
clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_split=2) # 当前支持计算信息增益和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 matplotlib.pyplot as plt
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)
plt.plot(fpr_train, tpr_train)
plt.title('ROC curve')
plt.show()
#%%
print('AUC = %6.4f' %metrics.auc(fpr_test, tpr_test))
#%%
import pydotplus
from IPython.display import Image
import sklearn.tree as tree
# In[18]:
dot_data = tree.export_graphviz(
    clf, 
    out_file=None, 
    feature_names=data.columns,
    max_depth=5,
    class_names=['0','1'],
    filled=True

            
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png()) 
#%%
#1.2# 神经网络
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
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_params_
#%%
test_est_p=gcv.predict_proba(scaled_test_data)[:,1]
train_est_p=gcv.predict_proba(scaled_train_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=[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))
#%%
#结论:最优决策树的测试数据集的AUC为0.9049;最优神经网络模型的测试数据集的AUC为0.9219
#############################################################################################
#2)对income,attractive,assets进行分箱(4分箱)处理,用分箱后的数据建模,并比较与1)步骤中模型的表现是否有差异。
import os
import pandas as pd
os.chdir(r'D:\Python_Training\script_Python\10ANN\HW')
data = pd.read_csv('date_data_r.csv', skipinitialspace=True)
# In[3]:
target = data['Dated']
data = data.ix[:, :4]
data.head()
#2.1# 决策树
#%%
#网格搜索参数
#%%
import sklearn.tree as tree
from sklearn.model_selection import GridSearchCV
from sklearn import metrics
#%%
import sklearn.model_selection as cross_validation
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) # 划分训练集和测试集
#%%
param_grid = {
    'criterion':['entropy','gini'],
    'max_depth':[2,3,4],
    'min_samples_split':[2,4,6,8,10] 
}
clf = tree.DecisionTreeClassifier()
clfcv = GridSearchCV(estimator=clf, param_grid=param_grid, 
                   scoring='roc_auc', cv=4)
clfcv.fit(train_data, train_target)
#%%
clfcv.best_params_
#%%
clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_split=2) # 当前支持计算信息增益和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 matplotlib.pyplot as plt
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)
plt.plot(fpr_train, tpr_train)
plt.title('ROC curve')
plt.show()
#%%
print('AUC = %6.4f' %metrics.auc(fpr_test, tpr_test))
#%%
import pydotplus
from IPython.display import Image
import sklearn.tree as tree
# In[18]:
dot_data = tree.export_graphviz(
    clf, 
    out_file=None, 
    feature_names=data.columns,
    max_depth=5,
    class_names=['0','1'],
    filled=True

            
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png()) 
#%%
#2.2# 神经网络
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) # 划分训练集和测试集
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
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_params_
#%%
test_est_p=gcv.predict_proba(scaled_test_data)[:,1]
train_est_p=gcv.predict_proba(scaled_train_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=[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))
#%%
#结论:最优决策树的测试数据集的AUC为0.8806;最优神经网络模型的测试数据集的AUC为0.9362
#所以变量分箱之后,虽然信息丢失了一些,但是模型效果不一定变差。


###############################################################

以下视频都是R语言的,学习python的同学只需要听统计和数据挖掘算法基础即可。

第7讲预习视频:

链接: https://pan.baidu.com/s/1mGxpH0v6A1n-3lg3MpfKQw 密码: jwm9

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

0 个评论

要回复文章请先登录注册