import numpy as np
import pandas as pd
from sklearn import preprocessing
import matplotlib.pyplot as plt
plt.rc("font", size=14)
import seaborn as sns
sns.set(style="white") #设置seaborn画图的背景为白色
sns.set(style="whitegrid", color_codes=True)
df = pd.read_csv("./titanic_data.csv")
# 预览数据
df.head()
“““
PassengerId 乘客ID Survived 是否幸存。0遇难,1幸存 Pclass 船舱等级,1Upper,2Middle,3Lower Name 姓名, Sex 性别, Age 年龄 SibSp 兄弟姐妹及配偶个数 Parch 父母或子女个数 Ticket 乘客的船票号, Fare 乘客的船票价 Cabin 乘客所在舱位,object Embarked 乘客登船口岸
”””
print('数据集包含的数据个数 {}.'.format(df.shape[0]))
# 查看数据集中各个特征缺失的情况
df.isnull().sum()
# "age" 缺失的百分比
print('"age" 缺失的百分比 %.2f%%' %((df['age'].isnull().sum()/df.shape[0])*100))
ax = df["age"].hist(bins=15, color='teal', alpha=0.6)
ax.set(xlabel='age')
plt.xlim(-10,85)
plt.show()
# 年龄的均值
print('The mean of "Age" is %.2f' %(df["age"].mean(skipna=True)))
# 年龄的中间值
print('The median of "Age" is %.2f' %(df["age"].median(skipna=True)))
# 仓位缺失的百分比
print('"Cabin" 缺失的百分比 %.2f%%' %((df['cabin'].isnull().sum()/df.shape[0])*100))
#"Cabin" 缺失的百分比 77.48%
# 登船地点的缺失率
print('"Embarked" 缺失的百分比 %.2f%%' %((df['embarked'].isnull().sum()/df.shape[0])*100))
#"Embarked" 缺失的百分比 0.23%
#只有 0.23% 的乘客的登船地点数据缺失, 可以使用众数替代缺失的值.
print('按照登船地点分组 (C = Cherbourg, Q = Queenstown, S = Southampton):')
print(df['embarked'].value_counts())
sns.countplot(x='embarked', data=df, palette='Set2')
plt.show()
print('乘客登船地点的众数为 %s.' %df['embarked'].value_counts().idxmax())
print('乘客登船地点的众数为 %s.' %df['embarked'].value_counts().idxmax())
“““
基于以上分析, 我们进行如下调整:
”””
data = df.copy()
data["age"].fillna(df["age"].median(skipna=True), inplace=True)
data["embarked"].fillna(df['embarked'].value_counts().idxmax(), inplace=True)
data.drop('cabin', axis=1, inplace=True)
# 确认数据是否还包含缺失数据
data.isnull().sum()
data['pclass'].fillna(df["pclass"].value_counts().idxmax(), inplace=True)
data['survived'].fillna(df["survived"].value_counts().idxmax(), inplace=True)
data['sex'].fillna(df["sex"].value_counts().idxmax(), inplace=True)
data['sibsp'].fillna(df["sibsp"].value_counts().idxmax(), inplace=True)
data['parch'].fillna(df["parch"].value_counts().idxmax(), inplace=True)
data['ticket'].fillna(df["ticket"].value_counts().idxmax(), inplace=True)
data['fare'].fillna(df["fare"].value_counts().idxmax(), inplace=True)
#查看调整后的年龄分布
plt.figure(figsize=(15,8))
ax = df["age"].hist(bins=15, normed=True, stacked=True, color='teal', alpha=0.6)
df["age"].plot(kind='density', color='teal')
ax = data["age"].hist(bins=15, normed=True, stacked=True, color='orange', alpha=0.5)
data["age"].plot(kind='density', color='orange')
ax.legend(['Raw Age', 'Adjusted Age'])
ax.set(xlabel='Age')
plt.xlim(-10,85)
plt.show()
## 创建一个新的变量'TravelAlone'记录是否独自成行, 丢弃“sibsp” (一同登船的兄弟姐妹或者配偶数量)与“parch”(一同登船的父母或子女数量)
data['TravelAlone']=np.where((data["sibsp"]+data["parch"])>0, 0, 1)
data.drop('sibsp', axis=1, inplace=True)
data.drop('parch', axis=1, inplace=True)
# 对 Embarked","Sex"进行独热编码, 丢弃 'name', 'ticket'
final =pd.get_dummies(data, columns=["embarked","sex"])
final.drop('name', axis=1, inplace=True)
final.drop('ticket', axis=1, inplace=True)
final.head()
#数据分析
#年龄分布
plt.figure(figsize=(15,8))
ax = sns.kdeplot(final["age"][final.survived == 1], color="darkturquoise", shade=True)
sns.kdeplot(final["age"][final.survived == 0], color="lightcoral", shade=True)
plt.legend(['Survived', 'Died'])
plt.title('Density Plot of Age for Surviving Population and Deceased Population')
ax.set(xlabel='Age')
plt.xlim(-10,85)
plt.show()
#票价
plt.figure(figsize=(15,8))
ax = sns.kdeplot(final["fare"][final.survived == 1], color="darkturquoise", shade=True)
sns.kdeplot(final["fare"][final.survived == 0], color="lightcoral", shade=True)
plt.legend(['Survived', 'Died'])
plt.title('Density Plot of Fare for Surviving Population and Deceased Population')
ax.set(xlabel='Fare')
plt.xlim(-20,200)
plt.show()
“““
生还与遇难群体的票价分布差异比较大, 说明这个特征对预测乘客是否生还非常重要. 票价和仓位相关, 也许是仓位影响了逃生的效果, 我们接下来看仓位的分析.
”””
#仓位
sns.barplot('pclass', 'survived', data=df, color="darkturquoise")
plt.show()
#一等舱的生还可能性较大,说明地位权利金钱会影响获救情况
sns.barplot('embarked', 'survived', data=df, color="teal")
plt.show()
#一家人获救几率大一点,独自一人的获救率低一点
sns.barplot('TravelAlone', 'survived', data=final, color="mediumturquoise")
plt.show()
#外国女士优先,女士比男士生还可能性大一点
sns.barplot('sex', 'survived', data=df, color="aquamarine")
plt.show()
# 4. 使用Logistic Regression做预测
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import Imputer
# 使用如下特征做预测
cols = ["age","fare","TravelAlone","pclass","embarked_C","embarked_S","sex_male"]
# 创建 X (特征) 和 y (类别标签)
X = final[cols]
y = final['survived']
X = Imputer().fit_transform(X)
# 将 X 和 y 分为两个部分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
# 检测 logistic regression 模型的性能
# TODO 添加代码:
# 1.训练模型,
# 2.根据模型, 以 X_test 为输入, 生成变量 y_pred
logr = LogisticRegression()
logr.fit(X_train,y_train)
y_pred = logr.predict(X_test)
print('Train/Test split results:' %y_pred)
print("准确率为 %2.3f:" %accuracy_score(y_test, y_pred, normalize=True, sample_weight=None))
#使用随机森林算法
clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_train,y_train)
y_predrf = clf.predict(X_test)
print('Train/Test split results:' %y_pred)
print("准确率为 %2.3f:" %accuracy_score(y_test, y_predrf, normalize=True, sample_weight=None))
以上代码地址http://localhost:8888/notebooks/Titanic-homework/titanic-logistic-regression-homework.ipynb
以上学习有贪心学院课程课后作业,总结添加随机森林模型,比逻辑回归模型好一点点。后期可以在特征工程上再改善,试试别的模型。