Fork me on GitHub

kaggle_泰坦尼克幸存者可视化

泰坦尼克数据是kaggle中最经典的数据之一,本文通过对原数据的处理,利用决策树实现对幸存者的预测可视化。主要掌握的知识点:

  • 数据的导入及清洗
  • 缺失值如何处理
  • 删除不必要的属性
  • 如何将文字转成数字,让sklearn进行处理

导入相关模块和包

1
2
3
4
5
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier # 决策树的类
from sklearn.model_selection import GridSearchCV, train_test_split, cross_val_score # 网格搜索,TTS, 交叉验证

导入数据及查看信息

  • pandas中怎么导入数据:pd.read_csv("file_path")
  • 观察数据信息
    • head()查看前n行数据,默认是前5行
    • info()查看数据的各种属性和标签
  • 数据中部分属性存在缺失值
1
2
data = pd.read_csv(r"D:/Python/datalearning/sklearn/day08_data.csv")
data.head()

数据特点

  • Cabin属性中存在大量的缺失值
  • 数据中存在文字信息

数据预处理

严重缺失值的删除

1
2
3
# 将缺失值严重的数据进行删除
# axis=1:表示对列进行操作,inplace=True表示用生成的数据代替原来的数据
data.drop(["Cabin","Name","Ticket"], inplace=True, axis=1)

少量缺失值的填充

1
2
3
4
# 缺失值处理
data["Age"] = data["Age"].fillna(data["Age"].mean()) # 用均值进行填充
# 将存在缺失值数据的行进行删除,dropna默认对行进行操作
data = data.dropna()
  • Age字段中缺少量的值,通过平均值来进行填充,学习下fillna函数,默认是填充0;填充不仅仅是均值
  • Embarked字段中缺少值,将其他的字段全部dropna,使得每个属性的数据相同

查看某个属性的种类

属性的唯一性通过unique()来进行观察

1
2
3
4
# 查看属性中有多少类:通过unique()函数进行显示,结果只有3类
data["Embarked"].unique()

[OUT]:array(['S', 'C', 'Q'], dtype=object)

文字分类转成数字

由于sklearn不能处理文字,需要将上述属性的3个种类SCQ转成数字。

1
2
3
# 重点:如何将输出标签中的分类转成数字
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))

sex属性中只有M-F,转成0-1

  • loc:标签索引

  • iloc:数值索引

    int(True)结果为1

1
2
3
# data["sex"] = (data["Sex"] == "male").astype("int")
data.loc[:,"Sex"] = (data["Sex"] == "male").astype("int") # 将生成的布尔值转成0-1,
data.head()

样本数据获取

1
2
3
# 取出属性不是Survied的所有行的数据
X = data.iloc[:,data.columns != "Survived"]
y = data.iloc[:,data.columns == "Survived"] 作为最终的输出结果

TTS

1
Xtrain, Xtest, ytrain, ytest = train_test_split(X,y,test_size=0.3)

乱序索引的还原

经过上面的TTS步骤,索引已经被打烂了,需要进行还原。

1
2
3
# Xtrain.index = range(Xtrain.shape[0])
for i in [Xtrain, Xtest, ytrain, ytest]:
i.index = range(i.shape[0]) # 将range函数的结果赋值给索引

模型建立

  • 实例化
  • 进行拟合
  • 计算score
1
2
3
4
5
6
7
8
9
10
# 普通模型
clf = DecisionTreeClassifier(random_state=25)
clf = clf.fit(Xtrain, ytrain)
score = clf.score(Xtest,ytest)
score

# 交叉验证:结果未必会比上面的好
clf = DecisionTreeClassifier(random_state=25)
score = cross_val_score(clf,X,y,cv=10).mean()
score

不同max_depth下的模型拟合情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tr = []
te = []
for i in range(10):
clf = DecisionTreeClassifier(random_state=25
,max_depth=i+1 # max_depth不同
,criterion="entropy" # 欠拟合使用entropy
)
clf = clf.fit(Xtrain, ytrain)
score_tr = clf.score(Xtrain, ytrain)
score_te = cross_val_score(clf,X,y,cv=10).mean()
tr.append(score_tr)
te.append(score_te)
# print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))
plt.legend()
plt.show()

网格搜索

网格搜索是将多个参数的不同取值放在一起,同时进行参数的调节,找出最匹配的值,本质上是枚举技术。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基尼系数0-0.5;信息熵的范围是0-1;gini_threholds = np.linspace(0,0.5,50)
# [*range(1,10)]:转成列表形式
parameters = {
"criterion":("gini","entropy")
,"splitter":("best","random")
,"max_depth":[*range(1,10)]
,"min_samples_leaf":[*range(1,50,5)]
,"min_impurity_decrease":[*np.linspace(0,0.5,50)]
}

clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf,parameters,cv=10)
GS.fit(Xtrain,ytrain)

1
2
GS.best_params_   # 返回参数和参数取值列表中的最佳组合
GS.best_score_ # 网格搜索模型后的评判标准

本文标题:kaggle_泰坦尼克幸存者可视化

发布时间:2019年09月23日 - 16:09

原始链接:http://www.renpeter.cn/2019/09/23/kaggle-4-%E6%B3%B0%E5%9D%A6%E5%B0%BC%E5%85%8B%E5%B9%B8%E5%AD%98%E8%80%85%E5%8F%AF%E8%A7%86%E5%8C%96.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea