机器学习(4)---泰坦尼克号生存者预测案例


泰坦尼克号的沉没是世界上最严重的海难事故之一,今天我们通过分类树模型来预测一下哪些人可能成为幸存者。数据集来自https://www.kaggle.com/c/titanic
数据集包含两个csv格式文件,data为我们接下来要使用的数据,test为kaggle提供的测试集。


一、数据预处理

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
data=pd.read_csv(r"D:\Download\day08_data.csv",index_col=0)
#可print(data.head())查看一下数据,print(data.info())查看信息特征

#数据预处理,将改成数值类型的数据
#筛选特征
#删除缺失值过多的列,和观察判断来说和预测的y没有关系的列
data.drop(["Cabin","Name","Ticket"],inplace=True,axis=1) #参数意思是覆盖原图,删除掉列

##处理缺失值,对缺失值较多的列进行填补
data["Age"]=data["Age"].fillna(data["Age"].mean())
#print(data.info())看到Age已经填补满了
data = data.dropna() #删去两行,891变成了889

#将三分类变量转换为数值型变量
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))

#将二分类变量转换为数值型变量 #astype能够将一个pandas对象转换为某种类型
data.loc[:,"Sex"] = (data["Sex"]== "male").astype("int")

X = data.iloc[:,data.columns != "Survived"] #除标签那一列取出来
y = data.iloc[:,data.columns == "Survived"] #只取标签那一列
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3)

#修正测试集和训练集的索引
for i in [Xtrain, Xtest, Ytrain, Ytest]:
    i.index = range(i.shape[0])
clf = DecisionTreeClassifier(random_state=25)
clf = clf.fit(Xtrain, Ytrain)
score_ = clf.score(Xtest, Ytest)
print(score_) 
score = cross_val_score(clf,X,y,cv=10).mean()
print(score)

:我们可以运行看出分类树结果和交叉验证结果都是不到80%,效果不太好。我们需要在不同max_depth下观察模型的拟合状况。

二、模型学习曲线

tr = []
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=25
                                ,max_depth=i+1
                                )
    clf = clf.fit(Xtrain, Ytrain)
    score_tr = clf.score(Xtrain,Ytrain)
    score_te = cross_val_score(clf,X,y,cv=10).mean()
    tr.append(score_tr)
    te.append(score_te)
print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))
plt.legend()
plt.show()

在这里插入图片描述

tr = []
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=25
                                ,max_depth=i+1
                                criterion="entropy
                                )
    clf = clf.fit(Xtrain, Ytrain)
    score_tr = clf.score(Xtrain,Ytrain)
    score_te = cross_val_score(clf,X,y,cv=10).mean()
    tr.append(score_tr)
    te.append(score_te)
print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))
plt.legend()
plt.show()

在这里插入图片描述
结果:测试集的max准确度为0.8177860061287026。

三、网格搜索调整参数

结果:用网格搜索预计跑五分钟,得出最佳的参数组合。这次精确度也得到提升(由于数据集自身原因,提高的不是很多)。

gini_thresholds = np.linspace(0,0.5,20)
#parameters是一串参数和参数对应的取值范围
parameters = {'splitter':('best','random')
              ,'criterion':("gini","entropy")
              ,"max_depth":[*range(1,10)]
              ,'min_samples_leaf':[*range(1,50,5)]
              ,'min_impurity_decrease':[*np.linspace(0,0.5,20)]
             }
clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameters, cv=10)
GS = GS.fit(Xtrain,Ytrain)

print(GS.best_params_)
print(GS.best_score_)

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒冒菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值