数据预处理
在Kaggle中下载Tianic数据集并引入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
import seaborn as sns
import warnings
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
train = pd.read_csv('C:/Users/lenovo/Desktop/pythonexp/22 proj/Titanic/dataset/train.csv')
test = pd.read_csv('C:/Users/lenovo/Desktop/pythonexp/22 proj/Titanic/dataset/test.csv')
train.info() # 查看train.csv的总体情况
print(train.isnull().sum())
查看数据整体情况
可以看到数据存在缺省值,并且部分数据需要进行处理。
train['Age']=train['Age'].fillna(train['Age'].mean() )
train['Embarked']=train['Embarked'].fillna('S')
#print(train.isnull().sum())
#我认为Cabin值大量缺失,填补没有意义。不将该参数纳入预测中
#将性别处理为数值变量
train['Sex'].replace('male',1,inplace=True)
train['Sex'].replace('female',0,inplace=True)
#对出发港口进行one-hot编码
embarkedDf = pd.DataFrame()
embarkedDf = pd.get_dummies(train['Embarked'] , prefix='Embarked' )
#print(embarkedDf)
train=pd.concat([train,embarkedDf],axis=1)
train.drop('Embarked',axis=1,inplace=True)
train = train.replace({True: 1, False: 0})
#对客舱等级进行one-hot编码
pclassdf=pd.DataFrame()
pclassdf=pd.get_dummies(train['Pclass'] , prefix='Pclass' )
train=pd.concat([train,pclassdf],axis=1)
train.drop('Pclass',axis=1,inplace=True)
train = train.replace({True: 1, False: 0})
对年龄变量中的缺省值用平均数填充。
观察数据后发现登船港口'S'占大部分,对登船港口变量采用众数填充。
性别变量进行数值化处理。
对出发港口和客舱等级变量进行one-hot编码。
相关性探究
对刚才处理过的数据进行分析研究,合理选取最终参与模型训练的变量。
df = train[['Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Survived','Embarked_C','Embarked_Q','Embarked_S','Pclass_1','Pclass_2','Pclass_3']]
# 属性间相关系数
cor = df.corr()
print(cor)
# 属性间相关系数热力图,annot表示将数值显示在图里
sns.heatmap(cor,annot=True)
plt.show()
'''
#下面进行单个变量分析
# 查看survived 与 Sex的关系
'''
Survived_Sex = train['Sex'].groupby(train['Survived'])
print(Survived_Sex.value_counts().unstack())
Survived_Sex.value_counts().unstack().plot(kind = 'bar', stacked = True)
plt.show()
相关性分析结果如下:
可以看到图中蓝色方框标出的变量与Survived存在较高相关性,考虑在其中选择有效的变量。
对上述标出的单个变量进行分析情况如下:
可以看到具有女性、客舱等级1、在C港口登陆特征的人存活的概率较大,证明这三类变量对存活结果有显著影响。
train.drop(['Ticket'], axis = 1, inplace=True)
train.drop(['SibSp'], axis = 1, inplace=True)
train.drop(['Parch'], axis = 1, inplace=True)
train.drop(['Cabin'], axis = 1, inplace=True)
train.drop(['Name'], axis = 1, inplace=True)
trainset,testset=train_test_split(train, test_size=0.1, random_state=42)
y_train=trainset['Survived']
trainset.drop(['Survived'],axis=1,inplace=True)
x_train=trainset
y_test=testset['Survived']
testset.drop(['Survived'],axis=1,inplace=True)
x_test=testset
删除数据中我认为对结果影响不大的列,并划分训练集与测试集。
选择模型
本次共选用4种常见的分类模型,包括:逻辑回归、随机森林、朴素贝叶斯、支持向量机。
model1 = LogisticRegression()
model1.fit(x_train,y_train)
y_pred = model1.predict(x_test)
accuracy1 = accuracy_score(y_test, y_pred)
print(f"逻辑回归准确率:{accuracy1:.4f}")
from sklearn.ensemble import RandomForestClassifier
model2 = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=5, min_samples_split=1.0,
min_samples_leaf=1, max_features='auto', bootstrap=False, oob_score=False, n_jobs=1,
random_state=0,
verbose=0)
model2.fit(x_train, y_train)
prediction3 = model2.predict(x_test)
accuracy2=accuracy_score(y_test, prediction3)
# 计算准确率
print(f"随机森林准确率:{accuracy2:.4f}")
from sklearn.naive_bayes import GaussianNB
model3 = GaussianNB()
model3.fit(x_train,y_train)
y_pred = model3.predict(x_test)
accuracy3 = accuracy_score(y_test, y_pred)
print(f"朴素贝叶斯准确率:{accuracy3:.4f}")
from sklearn.svm import SVC
model4 = SVC()
model4.fit(x_train,y_train)
y_pred = model4.predict(x_test)
accuracy4 = accuracy_score(y_test, y_pred)
print(f"支持向量机准确率:{accuracy4:.4f}")
测试结果
结果表明逻辑回归在此项目中的分类效果较好。