KNN算法预测泰坦尼克号乘客生存率

KNN算法预测泰坦尼克号乘客⽣存率
完成某团队的考核任务所写下的博客,先放上具体任务要求:
1.读取titanic_data.csv⽂件
2.对数据进⾏预处理(分割数据集为训练集和测试集,缺少数据处理等)
3.选择模型(⽬前只要求⽤knn,算法⾃⼰实现)
4.调整模型参数,确定最终模型
5.预测⽣存率
先看⼀下数据集的情况:
中国多媒体教学学报可以看出,Name和PassengerID这⼀项是明显弱相关的,我把这两个删掉。接下来看Cabin这⼀项,这是船舱号的意思,粗略地浏览了⼀下这⼀项数据,发现数据缺损严重,虽然说船舱的分布对⽣存有⼀定的影响,但考虑到数据的⼤量缺损,我也把它删掉。接下来看到Ticket这⼀项,这是船票编号,显然对⽣存率的影响不⼤,我也把它删掉,然后就剩下这些了:
我们的数据项也就剩下:Pclass(阶级,1最⾼,3最低),Sex,Age,Sibsp(同船兄的妹数量), parch(是否有配偶、亲⼈同船),Fare(恐惧指数), Embarked(登船港⼝)以及Survived(0表⽰遇难,1表⽰幸存)。
接下来进⾏数据预处理,读取数据,本⽂的代码⽤了python中的pandas包来进⾏读取。我⽤了panda
import pandas as pd
data=pd.ad_csv('D:gg.csv')) #创建并读取数据表
print (data)
我打印出来看看,结果发现有⼀些数据是缺损的,这就要在后续步骤⾥进⾏处理。
然后对数据集进⾏⼀下describe,运⾏结果如下:
刚刚提到,在Age这⼀块有⼀定的空值,在这⾥我⽤其平均值来填充空值。在后来我⼜发现,Embarked这⼀列数据中有少许空值,我先分别⽤1、2、3来代替S、C、Q三个港⼝的名称,然后我决定⽤这⼀组数据的众数进⾏填充空值。显⽽易见众数为1,所以我⽤1取代了空值。
完成这些任务后,我⽤先直接⽤python中已经封装好的knn函数来进⾏预测。
import pandas as pd
import numpy as np
del_selection import train_test_split
from sklearn import model_selection  #模型⽐较和选择包
ics import classification_report  #将主要分类指标以⽂本输出
ics import confusion_matrix #计算混淆矩阵,主要来评估分类的准确性
ics import accuracy_score #计算精度得分
ighbors import KNeighborsClassifier #导⼊最近邻算法中的KNN最近邻分类包
data=pd.ad_csv('D:gg.csv')) #创建并读取数据表朱思宜
#设置特征值和⽬标值
X = np.array(data[['Pclass', 'Sex', 'SibSp', 'Parch', 'Fare','Embarked']])
索爱mp5
用岁月在莲上写诗Y = np.array(data['Survived'])
#分割数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.1, random_state = 0)
#测试机制:采⽤10倍交叉验证法。即通过把数据集分为10份,9份⽤于训练,1份⽤于验证,并重复训练分组的所有组合。models = [] #建⽴列表
models.append(('KNN', KNeighborsClassifier()))
results = []
names = []
seed = 7
蔡光欣
for name, model in models: #将算法名称与函数分别读取
kfold = model_selection.KFold(n_splits=10, random_state=seed) #建⽴10倍交叉验证
cv_results = ss_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, an(), cv_results.std())
print(msg)
# 对数据集进⾏预测
knn = KNeighborsClassifier(n_neighbors=20, weights= 'distance', algorithm='auto',
leaf_size=5, p=1, metric='minkowski', metric_params=None, n_jobs=-1)
knn.fit(X_train, Y_train) #knn拟合序列集
predictions = knn.predict(X_test) #预测验证集
print(accuracy_score(Y_test, predictions)) #验证集精度得分
print(confusion_matrix(Y_test, predictions)) #混淆矩阵
print(classification_report(Y_test, predictions)) #分类预测报告
运⾏结果如下:
结果,准确率低的惊⼈。。。这⾥⾯必定有弱相关特征造成了影响,或者我误删了某些强相关的特征。那么我先⽤⼀种简单粗暴的⽅法来解决⾥⾯是否有弱相关特征的影响,就是⽤启发式验证法。
我先删掉了Parch这⼀项,然后运⾏结果提⾼了⼀个点。。我同时⼜删掉Embarked这⼀项后,预测准确率只⽐原来提⾼了两个点;但我单独删掉Embarked这⼀项,预测准确率却⽐原来提⾼了三个点,所以我选择了保留Parch⽽删掉Embarked,其实考虑⼀下实际情况也有道理,如果你⼀家⽼⼩去乘船
出事了,你肯定要顾及⾃⼰的家⼈⽽可能导致部分家庭成员失去了逃⽣的机会,死亡率也会提⾼;⽽独⾃⼀⼈的话,可能没有这⽅⾯因素会影响⾃⼰的逃⽣,幸存率也就上来了。
然后我接着删,但结果都不尽⼈意,反⽽还导致了下降,所以我回头看我是否删掉了某些重要的强相关的特征。我⽤pandas来进⾏数据分析。观察原始数据发现,cabin这⼀项数据存在⼀定量的缺损值,但并不可以就此否定其对结果的影响,所以我选择查看⼀下有Cabin信息和⽆Cabin信息的获救⽐例:
import pandas as pd
import matplotlib.pyplot as plt
data = pd.ad_csv('D:gg.csv')) #创建并读取数据表
plt.subplot2grid((1, 2), (0, 0))
plt.title('when Cabin exist')
data[data['Cabin'].notnull()]['Survived'].value_counts().plot(kind = 'bar')
plt.subplot2grid((1, 2), (0, 0))
plt.title('when Cabin does not exist')
data[data['Cabin'].isnull()]['Survived'].value_counts().plot(kind = 'bar')
plt.show()
结果如下:
可以看出,若有Cabin这⼀项获救的机率会⼤⼤增加。所以在之前我删掉的Cabin应该很有必要加进去并且实⾏⼀定的处理。在这⾥我简单的把有Cabin和⽆Cabin直接⽤0和1来替换。可惜准确率还是停留在76%的样⼦,也许KNN算法并不合适吧。。。
旧金山和约 全文
最后放上源码,这⾥我是直接调⽤sklearn⾥⾯已经封装好的函数。

本文发布于:2024-09-22 19:30:26,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/326088.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   预测   影响   删掉   相关   发现
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议