数据分析类

kaggle项目之Titanic数据集

2018-06-12  本文已影响35人  汝心若知

本例主要针对kaggle上的Titanic数据集进行分析预测,文章主体分为以下两个部分:

在开始进行分析之前,让我们仔细回顾下一个机器学习项目的流程。

数据集/问题——>特征处理——>算法建模——>评估

第一步,数据集/问题

机器学习是用来解决实际问题的,收集与实际问题有关的数据,能够有助于后续步骤的继续进行。在这个阶段需要知道

第二步,特征处理
第三步,算法

根据是否需要labels,分为监督学习和非监督学习

第四步,评估

PS:
以上步骤的顺序不是绝对的,为了获得拥有强大泛化能力的模型,我们需要不断地重复某些步骤。

———————Titanic数据集的分析与预测——————

n久之前,初生不畏牛犊的我,进入了kaggel,第一个练手的数据集——Titanic,死得剧惨。重新整理了思路了之后,预测效果也好了很多,具体思路见下文。

主要思路

  1. 加载数据集并进行简要探索性分析
  2. 特征工程
  3. 建模与模型评估

以前分析思路:
加载数据集——数据清理——探索性分析——特征处理——建模评估

1. 加载数据集&探索性分析

(1)数据概览:

train:


头几行数据
数据类型与空值状况
数据分布的整体状况

从简要的概览中,可以看出训练集中存在这些情况:

测试集的加载和训练集类似,可以自己去试下。
这里为方便处理,合并训练集和测试集,生成新的DataFrame.

#合并测试集和训练集
df =  pd.concat([train, test], axis=0).reset_index()
(2)从分布来看:

a. 整体的生存状况


image

b. SeX


image
c. Pclass
image
image

d. Embarked


image
e. Age
image
f. Fare
image
g. Parch
image
h. SibSp
image

发现:

2. 特征工程

(1)Embarked
#缺失值填充
df['Embarked'].fillna("S",inplace=True)
#数值化S,C,Q
le = LabelEncoder()
le.fit(df['Embarked'])
df['Embarked'] = le.transform(df['Embarked'])
(2)Fare
#分配到个人票价
df['Fare'] = df['Fare'] / df.groupby('Ticket')['Fare'].transform('count')
df['Fare'].fillna(df['Fare'].median(),inplace=True)
sns.distplot(df["Fare"])
plt.title("Distribution of Fare");
image
#定义一个票价分级函数
def fare_level(s):
    if s <= 5 :
        m = 0
    elif s>5 and s<=20:
        m = 1
    elif s>20 and s<=40:
        m = 2
    else:
        m = 3
    return m
df['Fare_level'] = df['Fare'].apply(fare_level)
(3)Parch and SibSp
#组合Parch,SibSp
df['Family_memebers'] = df['Parch'] + df['SibSp'] + 1
(4)Sex
#数值化性别
le.fit(df['Sex'])
df['Sex'] = le.transform(df['Sex'])
(5)Age

年龄拥有大量的缺失值,处理方法有很多中,这里采用建立一个回归模型预测年龄缺失值。

#利用线性回归和随机森林回归模型预测Age的值
age_nan = pd.DataFrame(df[['Age', 'Sex','Family_memebers', 'Fare',  'Pclass', 'Embarked']])
age_train = age_nan[age_nan.Age.notnull()]
age_test = age_nan[age_nan.Age.isnull()]
#线性回归
lr = LinearRegression()
lr_grid_pattern = {'fit_intercept': [True], 'normalize': [True]}
lr_grid = GridSearchCV(lr, lr_grid_pattern, cv=10, n_jobs=25, verbose=1, scoring='neg_mean_squared_error')
lr_grid.fit(age_train.drop("Age",axis=1), age_train["Age"])
print('Age feature Best LR Params:' + str(lr_grid.best_params_))
print('Age feature Best LR Score:' + str(lr_grid.best_score_))
lr = lr_grid.predict(age_test.drop("Age",axis=1))
#随机森林回归
rfr = RandomForestRegressor()
rfr_grid_pattern = {'max_depth': [3], 'max_features': [3]}
rfr_grid = GridSearchCV(rfr, rfr_grid_pattern, cv=10, n_jobs=25, verbose=1, scoring='neg_mean_squared_error')
rfr_grid.fit(age_train.drop("Age",axis=1), age_train["Age"])
print('Age feature Best LR Params:' + str(rfr_grid.best_params_))
print('Age feature Best LR Score:' + str(rfr_grid.best_score_))
rfr = rfr_grid.predict(age_test.drop("Age",axis=1))
#取二者均值
age_test["Age"] = (lr+rfr)/2
#定义年龄分级的函数
def age_level(s):
    if s <= 15 :      #儿童
        m = 0      
    elif s>15 and s<=30: #青年及少年
        m = 1
    elif s>30 and s<=60: #壮年
        m = 2
    else:               #老年
        m = 3
    return m
df["Age_level"] = df["Age"].apply(age_level)

3. 建模与模型评估

X = df[:len(train)][['Age_level', 'Sex','Family_memebers', 'Fare_level',  'Pclass', 'Embarked']]
y = df[:len(train)]["Survived"]
(1)评估方法
(2)建模

利用交叉检验得到结果,cv = 10,指标为准确率,可以看到SVC具有出色的表现。


image
(3)模型优化

主要利用GridSearchCV寻找最佳拟合的结果。

SVMC = SVC(probability=True)
svc_param_grid = {'kernel': ['rbf'], 
                  'gamma': [ 0.001, 0.01, 0.1, 1],
                  'C': [1, 10, 50, 100,200,300, 1000]}

gsSVMC = GridSearchCV(SVMC,param_grid = svc_param_grid, cv=10, scoring="accuracy", n_jobs= 4, verbose = 1)

gsSVMC.fit(X,y)
SVMC_best = gsSVMC.best_estimator_
(4)预测
features = ['Age_level', 'Sex','Family_memebers', 'Fare_level',  'Pclass', 'Embarked']

SVMC_best.fit(X,y)

out_text = SVMC_best.predict(df[len(train):][features])
text = pd.DataFrame(out_text.astype(int),index=df[len(train):]['PassengerId'].values).reset_index() 
text.rename(columns={"index":"PassengerId",0:"Survived"}).to_csv('predict_02.csv',index=False)

最后的结果:


image

笔者终于从倒数爬到了正数,不容易。
总体上来看,

原文代码:在这里

上一篇 下一篇

猜你喜欢

热点阅读