目录

  • 机器学习项目实战(一)
  • Titanic数据集乘客获救预测
  • 背景:
  • 数据预处理
  • 数据空值处理
  • 使用三个模型来对目标数据进行预测;分别是线性回归模型、逻辑回归模型以及随机森林模型
  • 线性回归模型
  • 逻辑回归模型
  • 增加"Sex","Embarked"特征
  • 随机森林模型
  • 使用网格搜索寻找最佳参数组合
  • 对测试集数据进行处理


机器学习项目实战(一)

Titanic数据集乘客获救预测

背景:

背景说明:泰坦尼克沉船是震惊世界的海难事件,1912年4月15日,在它的处女航中,撞上冰川后沉没。造成了超过1502人死亡,该事件也引起了全世界对于船舶安全法规的重视。在这场灾难中,有一些因素也导致了部分乘客的获救机率比较高,如老人,小孩,上流阶层,我们的目标是利用机器学习算法对获救乘客就行准确的预测。

数据预处理

# 导入第三方库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 全文忽略警告
import warnings
warnings.filterwarnings('ignore')
# 导入数据
df_train =pd.read_csv('sklearn/项目一:Titanic数据集乘客获救预测/train.csv')
df_test =pd.read_csv('sklearn/项目一:Titanic数据集乘客获救预测/test.csv')
# 查看数据组成情况
print(df_train.shape,df_test.shape)

机器学习项目实战(一):Titanic数据集乘客获救预测_数据集


该数据集由两部分组成:

训练集:891条 测试集:418条

# 查看数据
df_train.head()

机器学习项目实战(一):Titanic数据集乘客获救预测_数据_02

# 查看数据字段类型
df_train.info()

机器学习项目实战(一):Titanic数据集乘客获救预测_数据_03

# 查看数据缺失情况
df_train.isnull().sum()

机器学习项目实战(一):Titanic数据集乘客获救预测_数据集_04


可以看出“Age”,“Cabin“,“Embarked”,三个特征存在缺失

# 查看数据描述
df_train.describe()

机器学习项目实战(一):Titanic数据集乘客获救预测_人工智能_05


特征选取 不做复杂的特征工程,采用最快速的方法做一个预测。

数据空值处理

1.Cabin列缺失值数量较多,直接填充会对最终结果产生较大的误差影响,暂时不考虑该特征。 2.Age列对最终结果的影响较大,取Age的中位数对空值进行填充。 3.PassengerID为连续的序列值,对最终结果没有影响,不考虑该特征。

# 取Age的中位数对空值进行填充
df_train['Age'] = df_train['Age'].fillna(df_train['Age'].median())
df_train.info()

机器学习项目实战(一):Titanic数据集乘客获救预测_数据分析_06

使用三个模型来对目标数据进行预测;分别是线性回归模型、逻辑回归模型以及随机森林模型

线性回归模型

# 导入第三方库
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import KFold

KFold 是sklearn 包中用于交叉验证的函数。 在机器学习中,将数据集A分为训练集(training set)B和测试集(test set)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。

# 选取简单的可用特征
features = ['Pclass','Age','SibSp','Parch','Fare']
LR = LinearRegression()
# 将样本分成三折交叉验证
kf = KFold(n_splits=3,shuffle=False)
predictions = []
for train_index,test_index in kf.split(df_train):
    train_predictors = df_train[features].iloc[train_index,:]
    train_target = df_train['Survived'].iloc[train_index]
    LR.fit(train_predictors,train_target)
    test_predictions = LR.predict(df_train[features].iloc[test_index,:])
    predictions.append(test_predictions)
predictions=np.concatenate(predictions,axis=0)
predictions[predictions > 0.5] = 1
predictions[predictions <= 0.5] = 0
accuracy = sum(predictions == df_train['Survived'])/len(predictions)
print('accuracy:',accuracy)

accuracy: 0.7037037037037037

逻辑回归模型

from sklearn.model_selection import cross_val_score # 交叉验证函数
from sklearn.linear_model import LogisticRegression
Lr = LogisticRegression()
score = cross_val_score(Lr,df_train[features],df_train['Survived'],cv=3)
print(score.mean())

cross_val_score:交叉验证函数,用于评估模型性能,他可以将数据集分成K个子集,每个子集轮流作为测试集,其余自己作为训练及,最终返回k个测试集的得分,这个函数可以用于分类、回归等不同类型的模型估计。

增加"Sex","Embarked"特征
df_train.head()

机器学习项目实战(一):Titanic数据集乘客获救预测_python_07

sex_map = {'male':0,'female':1}
df_train['Sex'] = df_train['Sex'].map(sex_map)
df_train['Embarked'].value_counts()
df_train['Embarked'] = df_train['Embarked'].fillna('S')
embarked_map = {'S':0,'C':1,'Q':2}
df_train['Embarked'] = df_train['Embarked'].map(embarked_map)
df_train.head()

机器学习项目实战(一):Titanic数据集乘客获救预测_数据分析_08

features = ['Pclass','Age','SibSp','Parch','Fare','Sex','Embarked']

score = cross_val_score(Lr,df_train[features],df_train['Survived'],cv=3)
print(score.mean())

从上述结果可以看出,增加新的’Sex’,'Embarked’特征,模型效果有一个极大的提升。

随机森林模型

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

RFC = RandomForestClassifier(n_estimators = 10,min_samples_split = 2,min_samples_leaf = 1)

kf = KFold(n_splits = 3)

scores = cross_val_score(RFC,df_train[features],df_train['Survived'],cv = kf)
print(scores.mean())

使用网格搜索寻找最佳参数组合

from sklearn.model_selection import GridSearchCV

param_grid = {'n_estimators':[10,20,30,40,50,60,70,80,90,100],'max_depth':[2,3,4,5,6,7,8,9]}

grid = GridSearchCV(RFC,param_grid = param_grid,scoring = 'roc_auc',cv = 5)
grid.fit(df_train[features],df_train['Survived'])

机器学习项目实战(一):Titanic数据集乘客获救预测_数据分析_09

print(grid.best_params_,grid.best_score_)
#选择最佳的模型

RFC = RandomForestClassifier(n_estimators = 20,max_depth = 6)

对测试集数据进行处理

df_test.head()
df_test.head()
# 对df_test的缺失数据集进行处理

df_test['Age'] = df_test['Age'].fillna(df_test['Age'].median())
df_test['Fare'] = df_test['Fare'].fillna(df_test['Fare'].max())
sex_map = {'male':0,'female':1}
df_test['Sex'] = df_test['Sex'].map(sex_map)
embarked_map = {'S':0,'C':1,'Q':2}
df_test['Embarked'] = df_test['Embarked'].map(embarked_map)
# 对RFC模型进行训练

RFC.fit(df_train[features],df_train['Survived'])
prediction = RFC.predict(df_test[features])
prediction[:10]
prediction

机器学习项目实战(一):Titanic数据集乘客获救预测_人工智能_10

# 将预测的结果数组与PassengerId合并称为DataFrame形式
submission = pd.DataFrame({
    'PassengerId':df_test['PassengerId'],
    'Survived':prediction
})
submission

机器学习项目实战(一):Titanic数据集乘客获救预测_人工智能_11