【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集
各位同學好,今天和大家分享一下python機器學習中的決策樹算法,在上一節中我介紹了決策樹算法的基本原理,這一節,我將通過實例應用帶大家進一步認識這個算法。文末有完整代碼和數據集,需要的自取。那我們開始吧
【機器學習】(4) 決策樹算法理論:算法原理、信息熵、信息增益、預剪枝、后剪枝、算法選擇
1. Sklearn實現決策樹
首先我來介紹一下sklearn庫中的決策樹分類器?sklearn.tree.DecisionTreeClassifier
導入方法: from sklearn.tree import DecisionTreeClassifier
決策樹分類器?DecisionTreeClassifier() 有如下參數在操作時需要注意:
criterion: gini(基尼系數)?或者 entropy(信息熵) 方法。
spliter: best 或 random。best是在所有特征中找到最好的切分點,random是隨即找一些特征來進行切分(數據量大時用random)。
max_depth: 樹的最大深度。當特征或者數量比較小的時候可以不用管這個值,特征比較多的時候可以限制一下。
min_sample_split: 決策樹中某個葉子節點的樣本最小個數,如果數據量不大,不需要管這個值,如果樣本量比較大,推薦增大這個值。
min_weight_fraction_leaf: 葉子節點所有樣本權重和最小值,如果小于這個值,則會和兄弟節點一起被剪枝,默認為0,也就是不考慮權重的問題。?一般來說,如果我們有較多的樣本有缺失值,或者分類樹樣本的分布類別差別很大,就會引入樣本權重,這是我們需要注意這個值。
max_leaf_nodes: 最大的葉子節點個數,默認是None,即不限制葉子節點的個數,如果設置了這個值,那么決策樹建立的過程中優化葉子節點的個數,如果特征不多,可以不考慮這個值,但如果特征多的話,可以加以限制。
class_weight: 指定樣本各特征的權重,默認是balance,即算法自動調節權值。主要是為了
min_impurity_decrease: 最小的不純度(基尼系數、信息增益等),如果小于這個數,那么就不會再往下生成葉子節點了。
2. 案例實戰
2.1 案例簡介
????????導入泰坦尼克號沉船幸存者數據,含有票價、性別、船艙等10項特征值,一列目標值即是否幸存。由于到目前為止文章暫未涉及特征工程等其他機器學習知識,在本章節中我們先選取其中性別、年齡、幾等艙三項指標作為特征值,是否幸存作為目標值,構建決策樹,幫助大家理解簡單算法。后續等特征工程講完,會將所有特征指標放入預測模型中。感興趣的小伙伴,可看后續章節。
2.2 數據獲取
數據集獲取地址:https://github.com/fayduan/Kaggle_Titanic
#(1)數據獲取
# 導入泰坦尼克號沉船幸存者和死者數據
import pandas as pd
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件處理\\泰坦尼克數據集\\taitan.csv'
data = pd.read_csv(filepath)
# survived列代表是否獲救,pclass代表坐在什么等級的船艙
????????導入到數據中有數值型、字符串型數據,也存在缺失值,完整操作方法會在后續章節介紹。本節先使用性別sex、年齡age、幾等艙pclass三項指標作為特征值,便于大家對決策樹算法有個清晰的認識。
2.2 數據預處理?
????????選取性別、年齡、幾等艙所謂特征。處理缺失值nan,采用平均年齡填充年齡的缺失值,劃分特征值features和目標值data_targets。
Pandas中填充缺失值的操作:變量名.fillna() ?
填充缺失數據方法:
(1)用某個值替換nan,返回新dataframe給新變量,原dataframe不變
????????變量名.fillna(替換值) ?
(2)直接對原dataframe修改,不產生返回值
????????變量名.fillna(替換值,inplace=True) ?
(3)使nan與前一行的值相同,默認所有nan都和前一行相同
????????變量名.fillna(method='ffill') ?
(4)使接下去的幾個nan和前一行相同
????????變量名.fillna(method='ffill',limit=數量n) ?
#(2)數據處理
# 選取特征:幾等倉、性別、年齡
features = data[['Pclass','Age','Sex']]
# 處理缺失值,缺失的年齡變成平均年齡
features['Age'].fillna(features['Age'].mean(),inplace=True)
# 獲取目標值
data_targets = data['Survived']
2.3 特征提取
????????由于特征性別sex對應的值是字符串類型,而最終的訓練函數.fit()中,我們需要輸入的是數值類型數據或sparse矩陣。因此我們需要對sex這一列進行處理,將其轉換為數值型sparse矩陣。有關sparse矩陣及文本特征抽取方法的介紹見該篇文章的1.4小節:【機器學習】(2) 樸素貝葉斯算法:原理、實例應用(文檔分類預測)附python完整代碼及數據集??
????????
????????本次特征提取我們需要借助字典特征提取的方法 DictVectorizer(),先從sklearn中導入該方法:from sklearn.feature_extraction import DictVectorizer
????????我舉個例子幫助大家理解字典特征提取方法,首先我定義了一個由字典組成的列表,字典中有兩個key,分別是fruit和price,將fruit對應的值'蘋果''橘子''菠蘿'從字符串類型轉換成數值類型。要注意的是,vet.fit_transform() 函數中需要輸入的類型是由字典構成的列表。這樣才能將輸入的文本類型轉換成數值類型。用變量res接收sparse矩陣,使用?res.toarray()?函數將sparse矩陣轉換成數組便于觀察,vect.get_feature_names() 來獲取sparse矩陣的特征名。
# 字典特征抽取
from sklearn.feature_extraction import DictVectorizer
fruits = [{'fruit':'蘋果','price':5},{'fruit':'橘子','price':5.9},{'fruit':'菠蘿','price':9.9}]
# vect接收字典特征提取方法
vect = DictVectorizer()
# 提取特征,并變成sparse矩陣
res = vect.fit_transform(fruits)
# 轉換成數組,看得更清晰
res_arr = res.toarray()
# 獲取sparse矩陣的特征名
res_name = vect.get_feature_names()
# 特征名為'橘子''蘋果''菠蘿''price'
????????0代表橘子,1代表蘋果,2代表菠蘿,列表的第一個字典中的fruit是蘋果,因此0和2索引對應的數值為0,即不是橘子和菠蘿,同理列表的第2和3個字典。通過字典特征抽取,將文本數據轉變成數值類型數據。
?????????我們回到這個案例中進行特征抽取。現在的特征值是一個DataFrame類型,若想將文本數據轉換數值數據,首先要將Dataframe數據轉變成由字典組成的列表。借助.to_dict(orient = 'records')的方法,將特征值變成列表數據,用features接收,只有這種類型的數據才能傳入vect.fit_transform()函數中,data_features接收的是類型轉換后的sparse矩陣。
# sex特征是字符型數據,需要將其轉換成數值類型,或變成sparse矩陣
from sklearn.feature_extraction import DictVectorizer #字典特征提取方法
vect = DictVectorizer()
# 將dataframe類型數據轉換成由字典構成的列表:[{'pclass':3},{'age':20},{'sex':'male'}]
# 因為字典抽取方法vect.fit只能接收這種類型的數據
features = features.to_dict(orient = 'records')
# 提取特征值并轉換成spase矩陣
data_features = vect.fit_transform(features)
2.4 劃分訓練集和測試集
????????一般采用75%的數據用于訓練,25%用于測試,因此把數據進行訓練之前,先要對數據劃分。劃分方法不再贅述,有疑惑的可看下文中的第2.3節:【機器學習】(2) 樸素貝葉斯算法:原理、實例應用(文檔分類預測)附python完整代碼及數據集
#(4)劃分訓練集和測試集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data_features,data_targets,test_size=0.25)
2.5 決策樹分類預測
#(5)使用決策樹方法進行分類
from sklearn.tree import DecisionTreeClassifier
# 接收決策樹分類器
classifier = DecisionTreeClassifier()
# 訓練數據輸入,fit()只能識別數值類型,或sparse矩陣
classifier.fit(x_train,y_train)
# 評分法,準確率
accuracy = classifier.score(x_test,y_test)
# 預測
# result = classifier.predict(需要預測的x特征值數據)
????????采用評分法.score(),得到該模型準確率在80%左右,如果需要預測.predict()函數輸入的特征值x也需要是sparse數值型矩陣。本文就不寫了,若果有興趣的可在原數據的最后10行中劃分特征值和目標值,特征值作為.predict()預測函數的輸入,目標值用來預測驗證最終預測結果的準確性。如果不會劃分的話,可以看我前幾篇機器學習文章,謝謝各位。
數據集獲取
https://github.com/fayduan/Kaggle_Titanic
完整代碼如下
#(1)數據獲取
# 導入泰坦尼克號沉船幸存者和死者數據
import pandas as pd
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件處理\\泰坦尼克數據集\\taitan.csv'
data = pd.read_csv(filepath)
# survived列代表是否獲救,pclass代表坐在什么等級的船艙#(2)數據處理
# 選取特征:幾等倉、性別、年齡
features = data[['Pclass','Age','Sex']]
# 處理缺失值,缺失的年齡變成平均年齡
features['Age'].fillna(features['Age'].mean(),inplace=True)
# 獲取目標值
data_targets = data['Survived']##(3)特征抽取
# sex特征是字符型數據,需要將其轉換成數值類型,或變成sparse矩陣
from sklearn.feature_extraction import DictVectorizer #字典特征提取方法
vect = DictVectorizer()
# 將dataframe類型數據轉換成由字典構成的列表:[{'pclass':3},{'age':20},{'sex':'male'}]
# 因為字典抽取方法vect.fit只能接收這種類型的數據
features = features.to_dict(orient = 'records')# 提取特征值并轉換成spase矩陣
data_features = vect.fit_transform(features)#(4)劃分訓練集和測試集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data_features,data_targets,test_size=0.25)#(5)使用決策樹方法進行分類
from sklearn.tree import DecisionTreeClassifier
# 接收決策樹分類器
classifier = DecisionTreeClassifier()
# 訓練數據輸入,fit()只能識別數值類型,或sparse矩陣
classifier.fit(x_train,y_train)
# 評分法,準確率
accuracy = classifier.score(x_test,y_test)
# 預測
# result = classifier.predict(需要預測的x特征值數據)
總結
以上是生活随笔為你收集整理的【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习入门】(4) 决策树算法理论:
- 下一篇: 【Pandas库】(6) 索引操作--改