ML 监督学习 回归 树回归

Scikit-Learn用分裂回归树(Classification And Regression Tree,简称 CART)算法训练决策树。 在 sklean.tree 包中实现了 CART 模型,分别用 DecisionTreeClassifier 和DecisionTreeRegressor 实现了分类树和回归树。

首先使用单个特征和阈值 (例如,“花瓣长度 ≤2.45cm ”)将训练集分成两个子集当它成功的将训练集分成两部分之后,它将会继续使用相同的递归式逻辑继续的分割子集, 然后是子集的子集。

通常,算法使用Gini 不纯度来进行检测

CART算法是一种贪婪算法:它贪婪地搜索最高级别的最佳分割方 式,然后在每个深度重复该过程。 它不检查分割是否能够在几个级别中的全部分割可能 中找到最佳方法。贪婪算法通常会产生一个相当好的解决方法,但它不保证这是全局中 的最佳解决方案。

Regression

CART算法使用后剪枝法。有些样本集由于样本数太少而不能分出独立的测试样本集,CART算法采用一种称为交叉确定(crossvalidation)的剪枝方法。该方法解决了在小样本集上挖掘决策树由于没有独立测试样本集而造成的过度拟合问题。不过CART算法最初建立的树也有错误率,因为有些叶子节点并不是纯的。

回归树不再以最小化不 纯度的方式分割训练集,而是试图以最小化MSE 的方式分割训练集。

Cost Function
###### 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()

你可能感兴趣的:(ML 监督学习 回归 树回归)