带AdaBoost算法的决策树回归器(decision tree regressor)

Python机器学习经典实例

  • 准备工作

决策树是一个树状模型,每个节点都做出一个决策,从而影响最终结果。叶子节点表示输出
数值,分支表示根据输入特征做出的中间决策。AdaBoost算法是指自适应增强(adaptive boosting)
算法,这是一种利用其他系统增强模型准确性的技术。这种技术是将不同版本的算法结果进行组
合,用加权汇总的方式获得最终结果,被称为弱学习器(weak learners)。AdaBoost算法在每个阶
段获取的信息都会反馈到模型中,这样学习器就可以在后一阶段重点训练难以分类的样本。这种
学习方式可以增强系统的准确性。

首先使用AdaBoost算法对数据集进行回归拟合,再计算误差,然后根据误差评估结果,用同
样的数据集重新拟合。可以把这些看作是回归器的调优过程,直到达到预期的准确性。

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn import datasets
from sklearn.metrics import mean_squared_error, explained_variance_score
from sklearn.utils import shuffle
import matplotlib.pyplot as plt

housing_data = datasets.load_boston()
#通过shuffle函数把数据的顺序打乱:
X, y = shuffle(housing_data.data, housing_data.target, random_state=7)
#80%的数据用于训练,剩余20%的数据用于测试:
num_training = int(0.8 * len(X))
X_train, y_train = X[:num_training], y[:num_training]
X_test, y_test = X[num_training:], y[num_training:]
#拟合一个决策树回归模型了。选一个最大深度为4的决策树,这样可以限制决策树不变成任意深度:
dt_regressor = DecisionTreeRegressor(max_depth=4)
dt_regressor.fit(X_train, y_train)
#带AdaBoost算法的决策树回归模型进行拟合:
ab_regressor =AdaBoostRegressor(DecisionTreeRegressor(max_depth=4), n_estimators=400, random_state=7)
ab_regressor.fit(X_train, y_train)
#评价决策树回归器的训练效果:
y_pred_dt = dt_regressor.predict(X_test) 
mse = mean_squared_error(y_test, y_pred_dt) 
evs = explained_variance_score(y_test, y_pred_dt) 
print("\n#### Decision Tree performance ####") 
print("Mean squared error =", round(mse, 2)) 
print("Explained variance score =", round(evs, 2))
#评价一下AdaBoost算法改善的效果:
y_pred_ab = ab_regressor.predict(X_test) 
mse = mean_squared_error(y_test, y_pred_ab) 
evs = explained_variance_score(y_test, y_pred_ab) 
print("\n#### AdaBoost performance ####")
print("Mean squared error =", round(mse, 2)) 
print("Explained variance score =", round(evs, 2))

计算特征的相对重要性

如何判断哪个特征更加重要?显然,所有的特征对结果的贡献是不一
样的。如果需要忽略一些特征,就需要知道哪些特征不太重要。scikit-learn里面有这样的功能。

#画出特征的相对重要性
plot_feature_importances(dt_regressor.feature_importances_,  'Decision Tree regressor', housing_data.feature_names)
plot_feature_importances(ab_regressor.feature_importances_,  'AdaBoost regressor', housing_data.feature_names)
#回归器对象有一个feature_importances_方法会告诉我们每个特征的相对重要性。
def plot_feature_importances(feature_importances, title, feature_names):
    # 将重要性值标准化
    feature_importances = 100.0 * (feature_importances / max(feature_importances))
    # 将得分从高到低排序
    index_sorted = np.flipud(np.argsort(feature_importances))
    # 让X坐标轴上的标签居中显示
    pos = np.arange(index_sorted.shape[0]) + 0.5
    # 画条形图
    plt.figure()
    plt.bar(pos, feature_importances[index_sorted], align='center')
    plt.xticks(pos, feature_names[index_sorted])
    plt.ylabel('Relative Importance')
    plt.title(title)
    plt.show()

你可能感兴趣的:(python基础,算法,决策树,python,机器学习,算法)