机器学习Sklearn实战——梯度提升树二分类原理
生活随笔
收集整理的這篇文章主要介紹了
机器学习Sklearn实战——梯度提升树二分类原理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、算法使用
(一)創(chuàng)建
(二)參數(shù)調(diào)整
cross_val_score:求單一參數(shù)最合適的值(KNN)
GridSearchCV網(wǎng)格搜索:多參數(shù)組合最優(yōu)的值
標準:準確率,精確率,召回率,F1
(三)數(shù)據(jù)清洗
(四)操作數(shù)據(jù)庫(數(shù)據(jù)清洗)
(五)數(shù)據(jù)分析,可視化(Excel可視化的表)
二、算法原理
KNN原理,距離(調(diào)整,p=1,p=2設置p=1,p=2調(diào)和)
決策樹原理:熵、gini、梯度上升、梯度下降
隨機森林,極限森林:簡單決策樹+隨機性
梯度提升樹(回歸):每棵樹畫出來,顯示,推導
梯度提升分類樹
import numpy as np from sklearn.ensemble import GradientBoostingClassifier from sklearn import tree import matplotlib.pyplot as plt xi = np.arange(1,11) yi = np.array([0,0,0,1,1]*2)gbdt = GradientBoostingClassifier(n_estimators=3,max_depth=1) gbdt.fit(xi.reshape(-1,1),yi) gbdt.estimators_.shape #3是3棵樹,1是二分類問題(3分類問題是3 4分類問題是4) plt.figure(figsize=(9,6)) _ = tree.plot_tree(gbdt[0,0],filled = True) np.var(yi) 0.24F0 = np.log(4/6) -0.40546510810816444#殘差,概率,負梯度 yi_1 = yi - 1/(1+np.exp(-F0)) yi_1 array([-0.4, -0.4, -0.4, 0.6, 0.6, -0.4, -0.4, -0.4, 0.6, 0.6])#計算每個裂分點mse mse1 = [] for i in range (1,11):if i == 10:mse1.append(np.var(yi_1))else:mse1.append((np.var(yi_1[:i])*i+np.var(yi_1[i:])*(10-i))/10) mse1 [0.22222222222222224,0.2,0.17142857142857143,0.225,0.23999999999999994,0.23333333333333334,0.20952380952380958,0.15,0.2,0.24] np.var(yi_1[:8]) np.var(yi_1[8:]) 0.1875 0.0 np.round(yi_1[:8].sum()/(((yi[:8]-yi_1[:8])*(1-yi[:8]+yi_1[:8])).sum()),3) np.round(yi_1[8:].sum()/(((yi[8:]-yi_1[8:])*(1-yi[8:]+yi_1[8:])).sum()),3)結果:
-0.625 2.5 #第一棵樹數(shù)據(jù)預測的值 y_1 = [-0.625]*8 +[2.5]*2 y_1 = np.asarray(y_1) y_1gbdt[0,0].predict(xi.reshape(-1,1))結果:?
array([-0.625, -0.625, -0.625, -0.625, -0.625, -0.625, -0.625, -0.625,2.5 , 2.5 ]) array([-0.625, -0.625, -0.625, -0.625, -0.625, -0.625, -0.625, -0.625,2.5 , 2.5 ])?
I=1,xi屬于集合內(nèi)? ?I=0,xi不屬于集合內(nèi)
#learning_rate = 0.1 F1 = F0 + y_1*0.1 F1.round(4)結果:
array([-0.468 , -0.468 , -0.468 , -0.468 , -0.468 , -0.468 , -0.468 ,-0.468 , -0.1555, -0.1555]) yi_2 = yi - 1/(1+np.exp(-F1)) yi_2.round(4)結果:
array([-0.3851, -0.3851, -0.3851, 0.6149, 0.6149, -0.3851, -0.3851,-0.3851, 0.5388, 0.5388]) plt.figure(figsize=(16,8)) tree.plot_tree(gbdt[1,0],filled = True) #計算每個裂分點mse mse1 = [] for i in range (1,11):if i == 10:mse1.append(np.var(yi_2))else:mse1.append((np.var(yi_2[:i])*i+np.var(yi_2[i:])*(10-i))/10) mse1 mse1 = np.asarray(mse1) mse1結果:
array([0.20620922, 0.18564623, 0.1592081 , 0.21054968, 0.22242788,0.2186899 , 0.19976152, 0.15 , 0.19036645, 0.22265961]) np.round(yi_2[:8].sum()/(((yi[:8]-yi_2[:8])*(1-yi[:8]+yi_2[:8])).sum()),3) np.round(yi_2[8:].sum()/(((yi[8:]-yi_2[8:])*(1-yi[8:]+yi_2[8:])).sum()),3)結果:
-0.571 2.168 np.var(yi_2[:8]) np.var(yi_2[8:]) 0.1875 0.0總結
以上是生活随笔為你收集整理的机器学习Sklearn实战——梯度提升树二分类原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习Sklearn实战——极限森林、
- 下一篇: 机器学习Sklearn实战——adabo