"""主要是存储本人的笔记为主,但是希望和各位进行交流""
简介:该代码主要会用 train_test_split 及 cross_val_score验证模型的有效度。 此外,还会用GridSearchCV找出模型最优的参数。
step 1:对数据进行处理,比如填补或者删除缺失值。此外, 决策树无法处理文字,所以,我们需要把性别(sex)及 船票号码(embark)转换数字。比如,0,1,2等无意义的数字。
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import numpy as np
import graphviz
"""读取数据及观察数据"""
data = pd.read_csv("data【瑞客论坛 www.ruike1.com】.csv")
data.info()
data.head()
"""处理数据"""
##删除缺失值过多的列,和观察判断来说和预测的y没有关系的列
# inplace 是指将原有的数据进行合并。axis = 1 是指列00
data.drop(["Cabin","Name","Ticket","Cabin"],inplace=True,axis=1)
data.info()
#以整体年龄的平均数填充缺失值年龄,
data["Age"] = data["Age"].fillna(data["Age"].mean())
data.info()
#将缺失值的“行” 一并删除。 括号内 默认是“0”, 0 是指行的意思,反之1则是列的意思
data = data.dropna()
data.info()
#tolist是将数据转换成list的形式,而 unique主要是找出该数据含有那几种分类
label_1 = data["Embarked"].unique().tolist()
#将数据以 o 1 3 进行替换。 替换的原因是 decision tree classifier是不接受中文字的运算
data["Embarked"] = data["Embarked"].apply(lambda x: label_1.index(x))
#这是另外一种投机的转换方法。 因为 male 和femal 是以 true 和 false 的数据形式进行表达。
#我们直接按照下面的代码进行强制转换便可
data["Sex"] = (data["Sex"]== "male").astype("int")
Step 2 建立模型。
"""建立模型"""
#取出 所有行 的所有列的columns不等于 survivied的值
x = data[["Pclass","Sex","Age","SibSp","Fare","Embarked"]]
y = data["Survived"]
print(y)
#拆分数据集
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size = 0.3)
Step 3 粗略看看模型的分数(用train test split 及 cross validation(交叉验证)的方法)。
注意到:由于在step 2, 我们用了train test split 分割了数据。 数据的索引会有所混乱(ie,0 1 2,30,29,60之类的情况)。 所以在下面代码的 for 循环 是为了将代码的索引整理成 0 1 2 3. 这个步骤是为了在后面进行更好的测试模型的效能。
#由于索引在拆分的时候已经出现了混乱, 所以为了更好的进行modeling的操作,所以需要进行重新排列索引
for i in [x_train, x_test, y_train, y_test]:
i.index = range(i.shape[0])
clf = DecisionTreeClassifier(random_state=(25))
clf = clf.fit(x_train, y_train)
#这个是第一种验证模型的有效度
score_1 = clf.score(x_test, y_test)
score_1
#这是第二种方法验证模型的有效度
score_2 = cross_val_score(clf, x,y, cv=10).me