飞道的博客

【1 - 决策树 - 案例部分:泰坦尼克号幸存者预测】菜菜sklearn机器学习

390人阅读  评论(0)

课程地址:《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili

  • 第一期:sklearn入门 & 决策树在sklearn中的实现
  • 第二期:随机森林在sklearn中的实现
  • 第三期:sklearn中的数据预处理和特征工程
  • 第四期:sklearn中的降维算法PCA和SVD
  • 第五期:sklearn中的逻辑回归
  • 第六期:sklearn中的聚类算法K-Means
  • 第七期:sklearn中的支持向量机SVM(上)
  • 第八期:sklearn中的支持向量机SVM(下)
  • 第九期:sklearn中的线性回归大家族
  • 第十期:sklearn中的朴素贝叶斯
  • 第十一期:sklearn与XGBoost
  • 第十二期:sklearn中的神经网络

目录

问题描述

数据集 

代码

(一)导入数据集,探索数据 

(二)对数据集进行预处理 

(三)提取标签和特征矩阵,分测试集和训练集 

(四)导入模型 

(五)在不同max_depth下观察模型的拟合状况 

(六)用网格搜索调整参数

测试并提交Kaggle


问题描述 

Titanic - Machine Learning from Disaster | Kaggle

通过分类树模型来预测一下哪些人可能成为幸存者(二分类问题,Survived为1即为幸存者,为0则不是幸存者) 


数据集 

数据集包含两个csv格式文件,data为我们要使用的数据(既有特征又有标签,可以来训练和测试),test为kaggle提供的测试集(无标签)

data.csv(11个特征列,1个标签列)


代码


  
  1. import pandas as pd
  2. from sklearn.tree import DecisionTreeClassifier
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.model_selection import GridSearchCV
  5. from sklearn.model_selection import cross_val_score
  6. import matplotlib.pyplot as plt

(一)导入数据集,探索数据 


  
  1. data = pd.read_csv( r"D:\Jupyter Notebook\菜菜sklearn\1 决策树\Taitanic\data.csv") # 891行,12列(11列特征,1列标签)
  2. data.head() # 显示前n行,不写n的话默认为5

data.info()   # 观察特征的类型、是否有缺失值

  • Cabin列缺失过多,Name列、Ticket列、PassengerId列和预测的y没有关系,删
  • Age列有小部分缺失,采用平均值填充
  • Embarked列有2行缺失,删

(二)对数据集进行预处理 


  
  1. #删除缺失值过多的列,和观察判断来说和预测的y没有关系的列
  2. data.drop([ "Cabin", "Name", "Ticket", "PassengerId"],inplace= True,axis= 1) # inplace=True意味着用删除列后的表覆盖原表,默认为False。axis=1意味着对列进行操作
  3. # 或写成:data = data.drop(["Cabin","Name","Ticket"],inplace=False,axis=1)
  4. #处理缺失值,对缺失值较多的列进行填补,有一些特征只确实一两个值,可以采取直接删除记录的方法
  5. data[ "Age"] = data[ "Age"].fillna(data[ "Age"].mean()) # .fillna(0)表示用0填补
  6. data = data.dropna() # 删掉所有有缺失值的行(默认axis=0)


  
  1. #将分类变量转换为数值型变量
  2. #将二分类变量转换为数值型变量
  3. #astype能够将一个pandas对象转换为某种类型,和apply(int(x))不同,astype可以将文本类转换为数字,用这个方式可以很便捷地将二分类特征转换为0~1
  4. data[ "Sex"] = (data[ "Sex"]== "male").astype( "int") # 返回True为1,False为0
  5. #将三分类变量转换为数值型变量
  6. labels = data[ "Embarked"].unique().tolist() # .unique()删掉重复值,查看特征里有多少唯一值
  7. data[ "Embarked"] = data[ "Embarked"].apply( lambda x: labels.index(x)) # 匿名函数,S—>0,C—>1,Q—>2

(三)提取标签和特征矩阵,分测试集和训练集 


  
  1. X = data.iloc[:,data.columns != "Survived"]
  2. y = data.iloc[:,data.columns == "Survived"]
  3. # data.loc[:,'sex'] 所有行,sex列
  4. # data.iloc[:,3] 所有行,sex列(索引为3)
  5. # 布尔索引用loc和iloc都行
  6. from sklearn.model_selection import train_test_split
  7. Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size= 0.3)
索引是乱的

  
  1. #修正测试集和训练集的索引
  2. for i in [Xtrain, Xtest, Ytrain, Ytest]:
  3. i.index = range(i.shape[ 0]) # range(622),即0-621
调整索引

(四)导入模型 


  
  1. clf = DecisionTreeClassifier(random_state= 25)
  2. clf = clf.fit(Xtrain, Ytrain)
  3. score_ = clf.score(Xtest, Ytest)
  4. score_ # 0.8127340823970037
  5. score = cross_val_score(clf,X,y,cv= 10).mean()
  6. score # 0.7739274770173645

(五)在不同max_depth下观察模型的拟合状况 


  
  1. tr = []
  2. te = []
  3. for i in range( 10):
  4. clf = DecisionTreeClassifier(random_state= 25
  5. ,max_depth=i+ 1
  6. # ,criterion="entropy" # 当模型欠拟合时用
  7. )
  8. clf = clf.fit(Xtrain, Ytrain)
  9. score_tr = clf.score(Xtrain,Ytrain)
  10. score_te = cross_val_score(clf,X,y,cv= 10).mean()
  11. tr.append(score_tr)
  12. te.append(score_te)
  13. print( max(te))
  14. # 若train曲线在test上,说明模型过拟合,需要剪枝
  15. # 若test曲线在train上,说明模型欠拟合
  16. plt.plot( range( 1, 11),tr,color= "red",label= "train")
  17. plt.plot( range( 1, 11),te,color= "blue",label= "test")
  18. plt.xticks( range( 1, 11)) # 显示横坐标的标尺(1-10的整数)
  19. plt.legend()
  20. plt.show()

clf模型里一开始criterion参数默认为gini时,结果如下:

改为entropy时,结果如下:

(六)用网格搜索调整参数

网格搜索是能够帮助我们同时调整多个参数的技术,本质为枚举 —— 给网格搜索提供一个字典,字典中是一组一组的参数,对应参数的取值范围;调整参数在这些取值范围里的取值,最终返回能让模型达到最好的取值范围的组合。

缺点:多个参数交叉进行,计算量大,耗时,且无法舍弃你设定的参数 


  
  1. import numpy as np
  2. # gini系数取值范围为0-0.5,entropy取值范围为0-1
  3. gini_thresholds = np.linspace( 0, 0.5, 20) # 在0-0.5之间取20个有顺序的随机数,但不一定等间距
  4. # np.arange(0,0.5,0.01) 等间距
  5. parameters = { 'splitter':( 'best', 'random')
  6. , 'criterion':( "gini", "entropy")
  7. , "max_depth":[* range( 1, 10)] # *表示解压缩
  8. , 'min_samples_leaf':[* range( 1, 50, 5)]
  9. , 'min_impurity_decrease':[*np.linspace( 0, 0.5, 20)] # 信息增益的最小值。当信息增益<规定的最小值时,该节点将不再进行分枝
  10. } # 一串参数和这些参数对应的、我们希望网格搜索来搜索的参数的取值范围。是一个字典
  11. clf = DecisionTreeClassifier(random_state= 25)
  12. GS = GridSearchCV(clf, parameters, cv= 10) # 同时满足fit、score和交叉验证三种功能
  13. GS.fit(Xtrain,Ytrain)

GS.best_params_  # 从我们输入的参数和参数取值的列表中返回最佳组合

GS.best_score_    # 网格搜索后模型的评判标准


测试并提交Kaggle


  
  1. test = pd.read_csv( r"D:\Jupyter Notebook\菜菜sklearn\1 决策树\Taitanic\test.csv")
  2. test.info()
  3. test.drop([ "Cabin", "Name", "Ticket", "PassengerId"],inplace= True,axis= 1)
  4. test[ "Age"] = test[ "Age"].fillna(data[ "Age"].mean())
  5. test = test.dropna() # 删掉了Fare缺失的那一行
  6. #将二分类变量转换为数值型变量
  7. test[ "Sex"] = (test[ "Sex"]== "male").astype( "int")
  8. #将三分类变量转换为数值型变量
  9. labels = test[ "Embarked"].unique().tolist()
  10. test[ "Embarked"] = test[ "Embarked"].apply( lambda x: labels.index(x))
  11. result = GS.predict(test) # nd.array()
  12. df = pd.DataFrame(result)
  13. df.to_csv( "result.csv")

Score有点低


转载:https://blog.csdn.net/qq_43629945/article/details/128479813
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场