【调试】泰坦尼克号生存预测(线性回归)

这篇博客介绍了如何使用Python进行数据预处理,包括缺失值填充、哑变量处理,以及使用numpy的函数操作。接着,文章通过多元线性回归模型进行预测,并利用sklearn的KFold进行交叉验证,评估模型的预测准确率。最后,展示了在测试集上的预测过程。
摘要由CSDN通过智能技术生成

一、思维导图

 

二、程序调试

【函数记录】

矩阵插入行列 np.insert()

(21条消息) np.insert的用法_小明来喽的博客-CSDN博客

添加全0数组 np.zeros()      添加全1数组 np.ones()

(21条消息) python 中的np.zeros()和np.ones()函数_Wwwwwww527的博客-CSDN博客       查看矩阵维数 shape()

(21条消息) python中shape的解释_企鹅爱吃冰淇淋的博客-CSDN博客_shape

K折交叉验证 KFold()

(21条消息) K折交叉验证原理及其python实现_纸上得来终觉浅~的博客-CSDN博客

(21条消息) sklearn KFold()_Jennie-CSDN博客_kfold

(21条消息) 交叉验证——对数据集的划分_Emily-CSDN博客_交叉验证划分数据集

(21条消息) 关于sklearn.model_selected中的KFold.split的理解_Jack_kun的博客-CSDN博客_kf.split

数组拼接 np.concatenate()

(21条消息) 数组的拼接 np.concatenate( ) np.append( )用法和区别_升级打怪之路-CSDN博客_np按列拼接

【完整代码】

import numpy as np
import pandas as pd 
import seaborn as sns
import matplotlib.pyplot as plt

data_train=pd.read_csv('train.csv')
data_train.head()   #查看前5行信息

data_train.info()   #查看总体的信息
#可以发现age和cabin有大量缺失
#embarked只有2条缺失

#数据填充
#填充Age(用中位数)
data_train['Age']=data_train['Age'].fillna(data_train['Age'].median())
#填充Embarked(用众数)
#统计出Embarked列各个字母出现次数
ans=data_train['Embarked'].value_counts()
#返回最大值对应字母
fillstr=ans.idxmax()
data_train['Embarked']=data_train['Embarked'].fillna(fillstr)

#设置Sex与Embarked为哑变量
df1=pd.get_dummies(data_train['Sex'],prefix='Sex')  #设置哑变量
df2=pd.get_dummies(data_train['Embarked'],prefix='Embarked')  #设置哑变量
del data_train['Sex']      #删除原列
del data_train['Embarked']     #删除原列
data_train=pd.concat([data_train,df1,df2], axis=1)   #合并df
#data_train.iloc[:,[10,11,12,13,14]]

#求每个特征与分类结果Survived的相关性系数
train_corr = data_train.drop('PassengerId',axis=1).corr()
train_corr

#画出相关性热力图
a = plt.subplots(figsize=(15,9))  #调整画布大小
a = sns.heatmap(train_corr, vmin=-1, vmax=1 , annot=True , square=True)  #画热力图
#将Sex和Embarked设置为哑变量,相比原来的设置在相关性热力图中更能直观看出具体变量的相关性
#比如可以直接看到Female和Male与Survived的相关程度

#【--------------------实现多元线性回归--------------------】
# 获取样本
x_data=data_train[["Pclass","Age","Parch","Fare","Sex_female","Sex_male","Embarked_C","Embarked_Q","Embarked_S"]]
y_data=data_train['Survived']
x=x_data.values     #将dataframe转为矩阵(n维数组ndarray) 
y=y_data.values.reshape(-1,1)     #将dataframe变为列向量(n维数组,891×1)

# 标准化数据
def norm(x_data):
    mu = np.zeros(x_data.shape[1])  #shape[1]获取列数
    sigma = np.zeros(x_data.shape[1])
    mu=np.mean(x_data)
    sigma=np.std(x_data)
    x_norm=(x_data-mu)/sigma
    return x_norm
   
#添加常数项x0为全1的列向量
x_norm=np.insert(norm(x),0,np.ones(norm(x).shape[0]),axis=1)    #shape[0]获取行数
x_norm   # 891×7

#【使用梯度下降】
# 定义学习率
alpha=0.1
# 定义迭代次数
iters=700
#初始化theta为零向量(7×1) 
theta=np.zeros(x_norm.shape[1]).reshape(-1,1)
 
# 定义代价函数
def mutilCost(X,y,theta):
    m=X.shape[0]  # 样本数m
    bais=np.dot(theta.T,x_norm.T)-y.T
    cost=1/2/m*np.dot(bais,bais.T)
    return cost
 
# 定义梯度下降函数
def gradientDescentMulti(X, y, theta, alpha, num_iters):
    m=X.shape[0]
    cost_history =np.zeros(num_iters)
    for i in range(1,num_iters):
        theta=theta-alpha/m*X.T@(X@theta-y)
        cost_history[i] = mutilCost(X, y, theta)
    return theta,cost_history
 
#训练theta
[theta, cost_history] = gradientDescentMulti(x_norm, y, theta, alpha, iters)
 
#获取结果
ans=x_norm@theta

#这是一个2分类问题,结果为0、1;对于预测生存几率>=0.5的,认为其能存活,设置为1,<0.5的设置为0
ans[ans>=0.5]=1
ans[ans<0.5]=0
#print(ans.shape)    #返回(891,1)
data_train["Survived"].shape    #返回(891,),(n,)是一个数组,既不是行向量也不是列向量

# 查看准确率
accuracy = sum(ans == data_train["Survived"].values.reshape(-1,1)) / len(ans)
print("多元线性回归准确率为: ",accuracy[0])

#【-----------------使用sklearn中的Linear Regression来进行预测-----------------】
from sklearn.linear_model import LinearRegression   #导入线性回归
from sklearn.model_selection import KFold    #训练集进行交叉验证,得到均值
 
#选取简单的可用数字特征(所有自变量)
predictors=["Pclass","Age","Parch","Fare","Sex_female","Sex_male","Embarked_C","Embarked_Q","Embarked_S","SibSp"]     
#初始化现行回归算法
alg = LinearRegression()  

#样本平均分成10份,10折交叉验证 (9份做训练集,1份做测试集)
kf = KFold(n_splits=10,shuffle=True,random_state=1234)    #打乱划分,固定随机种子
predictions = []
for train,test in kf.split(data_train):    
    train_predictors = (data_train[predictors].iloc[train,:])
    train_target = data_train["Survived"].iloc[train]
    alg.fit(train_predictors,train_target)
    test_predictions = alg.predict(data_train[predictors].iloc[test,:])
    predictions.append(test_predictions)

#测试准确率
predictions = np.concatenate(predictions,axis=0)    #数组拼接,axis=0按行拼接
predictions[predictions>.5] = 1
predictions[predictions<=.5] = 0
accuracy = sum(predictions == data_train["Survived"]) / len(predictions)
print ("使用sklearn的LinearRegression预测准确率为: ", accuracy)

#【---------------在测试集上用所选模型进行预测---------------】
#对data_test进行与data_train一样的数据预处理

data_test=pd.read_csv('test.csv')
#填充Age(用中位数)
data_test['Age']=data_test['Age'].fillna(data_test['Age'].median())
#填充Embarked(用众数)
ans=data_test['Embarked'].value_counts()
fillstr=ans.idxmax()
data_test['Embarked']=data_test['Embarked'].fillna(fillstr)
#填充Fare(用中位数)
mid=data_test['Fare'].median()
data_test['Fare']=data_test['Fare'].fillna(value=mid)

#设置Sex与Embarked为哑变量
df1=pd.get_dummies(data_test['Sex'],prefix='Sex')  #设置哑变量
df2=pd.get_dummies(data_test['Embarked'],prefix='Embarked')  #设置哑变量
del data_test['Sex']      #删除原列
del data_test['Embarked']     #删除原列
data_test=pd.concat([data_test,df1,df2], axis=1)   #合并df
#data_test.iloc[:,[10,11,12,13,14]]    
 
#在测试集上进行预测
test_predictions = alg.predict(data_test[predictors])
test_predictions[test_predictions>=0.5]=1
test_predictions[test_predictions<0.5]=0
 
# 导出结果
result=pd.DataFrame({'PassengerId':data_test['PassengerId'].values,'Survived':test_predictions.astype(np.int32)})
result
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值