决策树完成 ---泰坦尼克号生存者预测

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV, train_test_split, cross_val_score  # 测试集训练集
## data.csv 我的博客里有,自己去找下载
data = pd.read_csv('data.csv')
pd.set_option('display.width', None)
# print(data.info())
# print(data.head())

# todo 筛选数据
# 可以删除不相关的项
data.drop(['Cabin', 'Name', 'Ticket'], inplace=True, axis=1)  # 删除字段,覆盖原表改为True,默认false  删除了列
# print(data)
# 年龄是重要的,需要补缺
data['Age'] = data['Age'].fillna(data['Age'].mean())  # 填入年龄的均值
# print(data.info())
data = data.dropna()  # 默认是 axis=0
# print(data.info())
# todo: 决策树处理不了文字,必须转换类型
# print(data['Embarked'])
# 结果都是 S C Q 三种,转换为0 1 2数字型 (十个以下可以这样处理)
labels = data['Embarked'].unique().tolist()
data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x))
# 性别 同样可以这样处理
# 但也有别的方法
data['Sex'] = (data['Sex'] == "male").astype("int")  # 这种方法将被删除了,官方建议下面的方法
# data.loc[:,"Sex"]=(data['Sex']=="male").astype("int")
# todo: 分离出来特征和标签
x = data.iloc[:, data.columns != "Survived"]  # 特征
y = data.iloc[:, data.columns == "Survived"]  # 标签
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
# todo:因为数据集的索引很混乱,最好处理下
# print(x_train)  # 索引很乱
for i in [x_train, x_test, y_train, y_test]:
    i.index = range(i.shape[0])
# print(x_train) # 舒服的很,索引从0开始
# print(y_train)

# todo::::::::: 准备工作完毕,开始跑模型

# clf=DecisionTreeClassifier(random_state=25)
# clf=clf.fit(x_train,y_train)
# score=clf.score(x_test,y_test)
# print(score)# 0.7265917602996255
#
# todo # 分数并不是很理想,加上交叉验证
# score=cross_val_score(clf,x,y,cv=10).mean()
# print(score)# 0.7469611848825333
# todo  # 交叉验证方法模型跑分仍然不高,需要调参,使用学习曲线看一下
# tr=[]
# te=[]
# for i in range(10):
#     clf = DecisionTreeClassifier(random_state=25,
#                                  max_depth=i+1,
#                                  criterion="entropy")
#     clf=clf.fit(x_train,y_train)
#     score_tr=clf.score(x_train,y_train)
#     # 来观测测试效果的数据
#     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()

# todo 学习曲线画起来比较麻烦,相对较好的技术------>
#  网格搜索(我们同时调整多个参数的技术,枚举技术)         # 缺点耗时

# min_impurity_decrease 取值范围不好确认
import numpy as np

# 基尼边界
# gini_threholds = np.linspace(0,0.5,50) # 生成0-0.5之间的50个随机有序的小数
# entropy_threholds=np.linspace(0,1,50)
# 一串参数和这些参数对应的,我们希望网格搜索来搜索的参数的取值范围
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, 20)]
}
clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameters, cv=10)  # 同时满足 fit score 和交叉验证三种功能
GS = GS.fit(x_train, y_train)

# todo:网格搜索重要接口
print(GS.best_params_)  # 从我们输入的参数和参数取值的列表中,返回最佳组合
# 打印结果{'criterion': 'gini', 'max_depth': 4, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 16, 'splitter': 'random'}

print(GS.best_score_)# 网格搜索后的模型的评判标准
# 打印结果
0.8118971061093248
# 根据个人电脑跑出模型时间,我的电脑大概在6分钟左右才出来结果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值