一、思维导图
二、程序调试
【函数记录】
矩阵插入行列 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