机器学习(二):房价预测

回归实战之房价预测

用所学的知识来解决真实世界的问题了。让我们用这些原理来估算房屋价格。房屋估价是理解回归分析最经典的案例之一,通常是一个不错的切入点。它符合人们的直觉,而且与人
们的生活息息相关,因此在用机器学习处理复杂事情之前,通过房屋估价可以更轻松地理解相关概念。我们将使用带AdaBoost算法的决策树回归器(decision tree regressor)来解决这个问题。
决策树是一个树状模型,每个节点都做出一个决策,从而影响最终结果。叶子节点表示输出数值,分支表示根据输入特征做出的中间决策。AdaBoost算法是指自适应增强(adaptive boosting)算法,这是一种利用其他系统增强模型准确性的技术。这种技术是将不同版本的算法结果进行组合,用加权汇总的方式获得最终结果,被称为弱学习器(weak learners)。AdaBoost算法在每个阶段获取的信息都会反馈到模型中,这样学习器就可以在后一阶段重点训练难以分类的样本。这种学习方式可以增强系统的准确性。

以上引自《Python机器学习经典实例》1.9,在这次实验中,为了结合上篇所学知识,我加入了线性回归和岭回归与决策树结果进行了量化对比。

完整代码

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

#加载标准房屋价格数据库的数据
housing_data = datasets.load_boston()
#print('data-------------------', housing_data.data)
#print('target-------------------', housing_data.target)

#整理输入与输出数据,利用shuffle把数据打乱,random_state控制如何打乱顺序
x,y = shuffle(housing_data.data, housing_data.target, random_state = 7)

#分出训练集与测试集
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))

#尝试使用线性回归
linear_regressor = linear_model.LinearRegression()
linear_regressor.fit(x_train,y_train)

#评价线性回归的结果
y_pred_dt = linear_regressor.predict(x_test)
mse = mean_squared_error(y_test, y_pred_dt)
evs = explained_variance_score(y_test, y_pred_dt)
print("\n### Linear Regressor performance ####")
print("Mean squared error = ", round(mse, 2))
print("Explained variance score = ",round(evs, 2))

#尝试使用岭回归
ridge_regressor = linear_model.Ridge(alpha=0.01, fit_intercept=True, max_iter=10000)
ridge_regressor.fit(x_train,y_train)

#评价岭回归的结果
y_pred_dt = ridge_regressor.predict(x_test)
mse = mean_squared_error(y_test, y_pred_dt)
evs = explained_variance_score(y_test, y_pred_dt)
print("\n### Ridge Regressor performance ####")
print("Mean squared error = ", round(mse, 2))
print("Explained variance score = ",round(evs, 2))

#定义plot_feature_importance函数用以画出特征重要性
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()

#画出特征的相对重要性
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)  

结果

机器学习(二):房价预测_第1张图片
机器学习(二):房价预测_第2张图片
机器学习(二):房价预测_第3张图片
可以看出利用AdaBoost优化决策树模型之后,均方误差更小,且解释方差分更接近1。线性回归与岭回归结果最差,且两者接近。
为方便学习给大家贴几个链接吧:

  • AdaBoost
  • 决策树
  • 均方误差MSE
  • 可释方差得分EVS没找到很好的了链接大家自行查阅吧。

结语

去吃饭了,下次一定

你可能感兴趣的:(机器学习,决策树,python,回归)