Scikit-Learn用分裂回歸樹(Classification And Regression Tree脉让,簡(jiǎn)稱 CART)算法訓(xùn)練決策樹。 在 sklean.tree 包中實(shí)現(xiàn)了 CART 模型匿乃,分別用 DecisionTreeClassifier 和DecisionTreeRegressor 實(shí)現(xiàn)了分類樹和回歸樹确封。
首先使用單個(gè)特征和閾值 (例如,“花瓣長度 ≤2.45cm ”)將訓(xùn)練集分成兩個(gè)子集當(dāng)它成功的將訓(xùn)練集分成兩部分之后巧号,它將會(huì)繼續(xù)使用相同的遞歸式邏輯繼續(xù)的分割子集含衔, 然后是子集的子集煎娇。
通常,算法使用Gini 不純度來進(jìn)行檢測(cè)
CART算法是一種貪婪算法:它貪婪地搜索最高級(jí)別的最佳分割方 式贪染,然后在每個(gè)深度重復(fù)該過程缓呛。 它不檢查分割是否能夠在幾個(gè)級(jí)別中的全部分割可能 中找到最佳方法。貪婪算法通常會(huì)產(chǎn)生一個(gè)相當(dāng)好的解決方法杭隙,但它不保證這是全局中 的最佳解決方案哟绊。
CART算法使用后剪枝法。有些樣本集由于樣本數(shù)太少而不能分出獨(dú)立的測(cè)試樣本集痰憎,CART算法采用一種稱為交叉確定(crossvalidation)的剪枝方法票髓。該方法解決了在小樣本集上挖掘決策樹由于沒有獨(dú)立測(cè)試樣本集而造成的過度擬合問題。不過CART算法最初建立的樹也有錯(cuò)誤率铣耘,因?yàn)橛行┤~子節(jié)點(diǎn)并不是純的洽沟。
回歸樹不再以最小化不 純度的方式分割訓(xùn)練集,而是試圖以最小化MSE 的方式分割訓(xùn)練集涡拘。
###### Regression #####
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import mean_squared_error
from sklearn.tree import DecisionTreeRegressor
# Load data
boston = datasets.load_boston()
print(boston.data.shape, boston.target.shape)
print(boston.feature_names)
data = pd.DataFrame(boston.data,columns=boston.feature_names)
data = pd.concat([data,pd.Series(boston.target,name='MEDV')],axis=1)
data.head()
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
x_training_set, x_test_set, y_training_set, y_test_set = train_test_split(X,y,test_size=0.10,random_state=40)
# Fit regression model
model = DecisionTreeRegressor(max_depth=5,random_state=0)
model.fit(x_training_set, y_training_set)
from sklearn.metrics import mean_squared_error, r2_score
model_score = model.score(x_training_set,y_training_set)
print('coefficient of determination R^2 of the prediction.: ',model_score)
y_predicted = model.predict(x_test_set)
# The mean squared error
print("Mean squared error: %.2f"% mean_squared_error(y_test_set, y_predicted))
# Explained variance score: 1 is perfect prediction
print('Test Variance score: %.2f' % r2_score(y_test_set, y_predicted))
from sklearn.model_selection import cross_val_predict
fig, ax = plt.subplots()
ax.scatter(y_test_set, y_predicted, edgecolors=(0, 0, 0))
ax.plot([y_test_set.min(), y_test_set.max()], [y_test_set.min(), y_test_set.max()], 'k--', lw=4)
ax.set_xlabel('Actual')
ax.set_ylabel('Predicted')
ax.set_title("Ground Truth vs Predicted")
plt.show()