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分钟左右才出来结果
决策树完成 ---泰坦尼克号生存者预测
最新推荐文章于 2022-01-07 00:32:56 发布