之前我們詳細講解過決策樹的原理,詳細內容可以參考該鏈結(
改進演算法
但使用資訊增益作為特徵選擇指標(id3演算法)容易造成過擬合。舉乙個簡單例子,每個類別如果都有乙個唯一id,通過id這個特徵就可以簡單分類,但這並不是有效的。為了解決這個問題,有了c4.5和cart演算法,其區別如下所示:
資料匯入與預處理
首先,對於一些不重要的資訊進行刪除(例如name);我們都知道,機器學習是沒法對字串進行計算的,這裡需要把***、embarked轉換為整數型別。
# 刪除列
df.drop(['name', 'ticket', 'cabin'], axis=1, inplace=true)
# ***轉換
def f1(x):
if x == 'male':
return 1
else:
return 0
然後,embarked有缺失值,我們通過seaborn進行視覺化,發現s值最多,所以通過s值進行缺失值填充。
年齡欄位也有缺失值,我們通過繪製直方圖,發現基本呈正態分佈,於是使用平均值來填充缺失值。
處理完成後的資料如下:
切分資料集
from sklearn.model_selection import train_test_split
x = df.iloc[:, 1:]
y = df['survived']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=22)
模型訓練與評估
決策樹演算法使用sklearn.tree模組中的decisiontreeclassifier方法。該方法有一系列引數來控制決策樹生成過程,從而解決過擬合問題(具體可看sklearn的官方文件)。常用的引數如下:
首先,我們不對引數進行調整。
from sklearn.tree import decisiontreeclassifier
clf = decisiontreeclassifier()
clf.fit(x_train, y_train)
clf.score(x_test, y_test)
# result
# 0.82122905027932958
我們用交叉驗證檢視模型的準確度,發現模型的精度並不是很高。
from sklearn.model_selection import cross_val_score
result = cross_val_score(clf, x, y, cv=10)
print(result.mean())
# result
# 0.772279536942
模型調優
我們可以設定不同的引數,對模型進行調優,這裡以max_depth為例,定義函式,求出最好的引數。
網格搜尋
但這種方法存在這兩個問題:
為了解決這些問題,sklearn提供gridsearchcv方法。
from sklearn.model_selection import gridsearchcv
threshholds = np.linspace(0, 0.5, 50)
param_grid =
clf = gridsearchcv(decisiontreeclassifier(), param_grid, cv=5)
clf.fit(x, y)
print("best param: \nbest score: ".format(clf.best_params_,
clf.best_score_))
# result
# best param:
best score: 0.8204264870931538
SKlearn之決策樹
決策樹是一種非引數的監督學習方法。模組 sklearn.tree sklearn建模的步驟 1 選擇並建立模型 例 clf tree.decisiontreeclassifier 2 提供資料訓練模型 例 clf clf.fit x train,y train 3 獲取需要的資訊 例 result ...
sklearn調包俠之KNN演算法
天下武功,唯快不破。今天就正式講解如何通過 sklearn小抄 武林秘籍,成為一代宗師調包俠。欲練此功,必先自宮 就算自宮,未必成功 若不自宮,也能成功。傳說江湖 機器學習領域 有兩大派別 一是學術派,該派資歷高,家境好,多為名門世家 學歷高,數學好 重基礎 數學推導和理論知識 一是實踐派,以找人切...
sklearn調包俠之邏輯回歸
傳送門 機器學習實戰之logistic回歸 正則化這裡補充下正則化的知識。當乙個模型太複雜時,就容易過擬合,解決的辦法是減少輸入特徵的個數,或者獲取更多的訓練樣本。正則化也是用來解決模型過擬合的一種方法。常用的有l1和l2範數做為正則化項。資料匯入 本次實戰依舊是使用sklearn中的資料集,如圖所...