knn-实现泰坦尼克号(原始数据表找作者领取)

#导入第三方库模块
import pandas as pd
#读入数据
data = pd.read_csv('titanic_data.csv')
#查看数据
print(data.head())

#删除无意义的变量,并检查剩余变量是否有缺失值
# data.drop(['PassengerId','Name','Ticket','Cabin'],axis = 1,inplace=True)
#print(data.isnull().sum(axis =0))  #把数据中为空的数据全都统计出来

#对sex进行分组,用各组乘客的平均年龄填充各组中的缺失年龄
fillna_data = []
for i in data.Sex.unique():
    updata = data.loc[data.Sex ==  i,].fillna(value = {'Age':data.Age[data.Sex == i].mean()},inplace = False)
    fillna_data.append(updata)
data = pd.concat(fillna_data)
#使用Embarked变量的众数填充值
# data.fillna(value = {'Embarked':data.Embarked.mode([0])},inplace=True)

# 将数值型的Pclass转化为类别型,否则无法对其哑变量处理
# data.Pclass = data.Pclass.astype('category')
# 哑变量处理
dummy = pd.get_dummies(data[['Sex']])
# 水平合并data数据集和哑变量的数据集
data = pd.concat([data,dummy],axis= 1)
# 删除原始的sex,Embarked和Pclass变量
data.drop(['Sex'],inplace=True,axis = 1)
print(data.head())

#构建决策树模型
#导入第三方包
from sklearn.model_selection import train_test_split
#取出所有的自变量名称
predictors  = data.columns[1:]

#将数据集拆分为训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(data[predictors],data.Survived,test_size=0.25,random_state=1234)



#导入第三方库模块
import warnings
warnings.filterwarnings("ignore")

#导入第三方库模块
import numpy as np
from sklearn import neighbors
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score

#设置待测试的不同的k值
K = np.arange(1,np.ceil(np.log2(data.shape[0])))
#构建空的列表,用于存储平均准确率
accuracy = []
#使用十重交叉验证的方法,比对每一个k值下KNN模型的预测准确率
for k in K:
    cv_result = cross_val_score(neighbors.KNeighborsClassifier(n_neighbors=int(k), weights='distance'), X_train, y_train, cv=10, scoring='accuracy')
    accuracy.append(cv_result.mean())

    #从k个平均准确率中挑选出最大值对应的下标
arg_max = np.array(accuracy).argmax()
#中文和负号的正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 绘制不同K值与平均预测准确率之间的折线图
plt.plot(K, accuracy)
# 添加点图
plt.scatter(K, accuracy)
# 添加文字说明
plt.text(K[arg_max], accuracy[arg_max], '最佳k值为%s' %int(K[arg_max]))
# 显示图形
plt.show()

#重新构建模型,并将最佳的近邻个数设置为5
knn_class = neighbors.KNeighborsClassifier(n_neighbors = 5, weights = 'distance')

#模型训练
knn_class.fit(X_train, y_train)

#模型预测
predict = knn_class.predict(X_test)


#构建混淆矩阵
cm = pd.crosstab(predict,y_test)



#导入第三方模块
import seaborn as sns
#将混淆矩阵构造成数据框,并加上字段名和行名称,用于行或列的含义说明
cm = pd.DataFrame(cm)

#绘制热力图
sns.heatmap(cm,annot=True,cmap ='GnBu')
#添加x轴和y轴的标签
plt.xlabel('Real Labels')
plt.ylabel('Predict Labels')
#图形显示
plt.show()

#导入第三方模块
from sklearn import metrics
from sklearn.metrics import accuracy_score
#模型整体的预测准确率
print(accuracy_score(y_test,predict))

# 分类模型的评估报告
print(metrics.classification_report(y_test,predict))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值