Python数据分析与挖掘——泰坦尼克号

Python数据分析与挖掘——泰坦尼克号

本文利用已给特征属性和存活与否标签的训练集和只包含特征信息测试集数据,通过决策树等模型来预测测试集数据乘客的生存情况
在这里插入图片描述

#导包
import numpy as np
import pandas as pd

from sklearn.tree import DecisionTreeClassifier as DTC  #决策树
from sklearn.model_selection import GridSearchCV # 超参数自动搜索模块
from sklearn.model_selection import train_test_split  #划分训练集和测试集

train=pd.read_csv('./train.csv')  #加载数据
#训练集数据整体情况
train.info()   #显示表格信息,判断含有缺失值和非数字的列

结果:结果展示
可以看出:
1.Name、Sex、Tocket、Cabin、Embarked是Object类型
2.可以看到Age、Cabin、Embarked是有缺失数据的

解决方法:
1.Age中的空值可用平均年龄来填充
2.Cabin有大量的缺失值,在训练集和测试集中缺失率都比较高,无法补齐
3.Embarked为登陆港口,可以根据港口属性补齐。可以看到港口为“S”类型的占比最高,可以考虑把缺失的港口用“S”港口填充

数据预处理

1.删除掉缺失值太多的列,与预测结果无关的列

train=train.drop(["Name","Cabin","Ticket","PassengerId"],axis=1)
train.info()

在这里插入图片描述
2.缺失值较多的列Age进行填充

train["Age"]=train["Age"].fillna(train["Age"].mean())
train.info()

在这里插入图片描述
3.极少缺失值的列Embarked删除有缺失值的行`

train=train.dropna(axis=0,how="any")
train.info()

在这里插入图片描述
查看表的数据

train

在这里插入图片描述
因为我们之后要用决策树等模型来建立模型,决策树不能处理文字类型,所以我们要将ex和Embarked转为数字一一转化文字

# data["Sex"]=='male'得到的是Series类型,均为false和true
# 只有两种数据时,用布尔转化为整数的方法
train["Sex"]=(train["Sex"]=='male').astype(int)  #布尔索引判断

train["Embarked"].unique() 
#unique函数去除其中重复的元素,并按元素由小到大返回一个新的无元素重复的元组或者列表。
labels=train["Embarked"].unique().tolist()
# 将数据用索引数字代替,相同的数据用同一数字
train["Embarked"]=train["Embarked"].apply(lambda x:labels.index(x))
train

经过处理之后,结果展示:
在这里插入图片描述

模型建立
特征与标签的提取
# 前表示取所有行,后面表示取列     loc里面使用的是字符串,iloc使用的是索引
x=train.loc[:,train.columns!='Survived']
x

特征:
在这里插入图片描述

y=train.loc[:,train.columns=='Survived']
y
# 训练与测试数据集的区分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)

#恢复索引
for i in [x_train,x_test,y_train,y_test]:
    i.index=range(i.shape[0])


模型
决策树
# 建模——使用分类树建模,对训练集拟合,对测试集进行预测评分
clf=DTC(criterion='entropy')  #实例化,用训练集数据训练模型
clf.fit(x_train,y_train)#拟合模型
score=clf.score(x_test,y_test)
score  #0.7752808988764045

优化模型

import graphviz
from sklearn import tree

dot_data=tree.export_graphviz(clf
                             ,class_names=["存活","死亡"]
                             ,filled=True #树的块填充颜色
                             ,rounded=True  #块的框是方圆形
                             )
graph =graphviz.Source(dot_data)#画出树 ,samples 样本数 ,value根据samples 的占比分配,

[*zip(x.columns,clf.feature_importances_)] #查看特征向量的重要性

from sklearn.model_selection import GridSearchCV  #网格搜索
parameters={'criterion':('gini','entropy')
                ,'splitter':('best','random')
                ,'max_depth':[*range(1,10)]
                ,'min_samples_leaf':[*range(1,50,5)] 
          }
Survived_model=DTC(random_state=25)
gs=GridSearchCV(Survived_model,parameters,cv=10)
gs.fit(x_train,y_train)

gs.best_params_  #查看最好的参数
gs.best_score_  #查看模型最好的评分

在这里插入图片描述

逻辑回归
from sklearn.linear_model import LogisticRegression as LR  #逻辑回归
from matplotlib import pyplot as plt
from sklearn.metrics import accuracy_score    # 引入比率分数,评估分类的好坏


l2=[]
l2test=[]
for i in np.arange(1,201,10):   #生成一个列表
    L2=LR(penalty='l2',solver='liblinear',C=0.8,max_iter=i)   #最大迭代数 max_iter  solver,四个参数,liblinear表示坐标下降法(l1和l2都可以用,小数据l1),sag表示随机梯度下降法(l2可以用,大于10万数据使用),newton-cg、lbfgs表示牛顿法(l2可以用)
    L2=L2.fit(x_train,y_train)
    l2.append(accuracy_score(L2.predict(x_train),y_train))
    l2test.append(accuracy_score(L2.predict(x_test),y_test))

#评估
print(accuracy_score(L2.predict(x_train),y_train))#0.8006430868167203
print(accuracy_score(L2.predict(x_test),y_test)) #0.8014981273408239

画图:

graph=[l2,l2test]
color=['black','gray']
label=['l2','l2test']

plt.figure(figsize=(8,8))
for i in range(len(graph)):
    plt.plot(np.arange(1,201,10),graph[i],color[i],label=label[i])
plt.legend()
plt.xticks(np.arange(1,201,10))
plt.show() #不再变化,说明找到了最优解

在这里插入图片描述

人工神经网络
from sklearn.neural_network import MLPClassifier as CNN  # 定义多层感知机分类算法

cnn=CNN((100,100))
cnn.fit(x_train,y_train)

print(cnn.score(x_train,y_train)) # 模型在训练集的准确率,训练好的模型在测试集上进行评分(0~1)1分代表最好 
y_pre=cnn.predict(x_test)
print(accuracy_score(y_pre,y_test))#accuracy_score()分类准确率分数是指所有分类正确的百分比。模型测试集的准确率
模型评估
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve

df=pd.read_csv('./gender_submission.csv',header=0)
df.head()

from sklearn.model_selection import train_test_split
X=df.iloc[:,:-1]
y=df.iloc[:,-1]
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

import matplotlib.pylab as plt
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus']=False 

Models=[LR,CNN,DTC]
for Model in Models:
    model=Model()
    model.fit(X_train,y_train)
    y_pre=model.predict(X_test)
    y_score=model.predict_proba(X_test)
    print('score',model.score(X_test,y_test))
    #print(y_score)
    fpr,tpr,thr = roc_curve(y_test,y_score[:,-1])
    plt.plot(fpr,tpr)
    plt.show()
    print('auc',roc_auc_score(y_test,y_score[:,-1]))

在这里插入图片描述

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值