【问题标题】:Why Gradient Boosting not working in Linear Regression?为什么梯度提升在线性回归中不起作用?
【发布时间】:2018-01-06 15:01:09
【问题描述】:

请帮助我理解为什么梯度提升技术不起作用。是不是 GB 在内部使用了决策树回归[混淆请澄清]。我正在尝试集成技术来获得当前数据集的最佳分数。此外,递归特征消除 [RFE] 似乎存在问题,相关矩阵直觉和来自 SKLearn 的 RFE 应该会产生相似的特征重要性。 请帮助我理解,递归特征消除 [RFE]、相关矩阵直觉和 SKLearn 的 RFE 并没有赋予相似的特征重要性。

from IPython.display import clear_output
from io import StringIO
import pandas as pd
import requests
import numpy as np
import matplotlib.pyplot as plt

url='https://raw.githubusercontent.com/saqibmujtaba/Machine-
Learning/DataFiles/50_Startups.csv'

s=requests.get(url).text
dataset=pd.read_csv(StringIO(s))

相关矩阵清楚地表明,研发支出对预测利润 [标签] 的重要性最高,其次是营销支出?

from pandas.tools.plotting import scatter_matrix
scatter_matrix(dataset)
plt.show()

# Create Independent Variable 
X=dataset.iloc[:,:-1].values 

# Dependent Variable              
Y=dataset.iloc[:,4].values

应用标签编码

labelencoder = LabelEncoder()
X[:, 3] = labelencoder.fit_transform(X[:, 3])

很明显,LabelEncoding 工作正常。

输出

[[165349.2 136897.8 471784.1 2L]
[162597.7 151377.59 443898.53 0L]
[153441.51 101145.55 407934.54 1L]
[144372.41 118671.85 383199.62 2L]
[142107.34 91391.77 366168.42 1L]]

尝试一种热编码,

onehotencoder = OneHotEncoder(categorical_features = [3])
X = onehotencoder.fit_transform(X).toarray()
np.set_printoptions(formatter={'float': '{: 0.0f}'.format})
print(X[0:5,:])

输出

[[ 0  0  1  165349  136898  471784]
[ 1  0  0  162598  151378  443899]
[ 0  1  0  153442  101146  407935]
[ 0  0  1  144372  118672  383200]
[ 0  1  0  142107  91392  366168]]

避免虚拟变量陷阱和特征缩放

X = X[:, 1:]
np.set_printoptions(formatter={'float': '{: 0.0f}'.format})
print(X[0:5,:])

输出

[[ 0  1  165349  136898  471784]
[ 0  0  162598  151378  443899]
[ 1  0  153442  101146  407935]
[ 0  1  144372  118672  383200]
[ 1  0  142107  91392  366168]]

首先,即使正确给出了研发支出,也应该其次是营销支出?另外,为什么利润特征是选择的一部分,因为我已经清楚地将 Y 作为线性回归拟合中的标签传递了?我错过了什么吗?

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression

# feature extraction
# Rank all features, i.e continue the elimination until the last one
rfe = RFE(estimator=lr, n_features_to_select=1)
fit = rfe.fit(X,Y)
print("Num Features: %d") % fit.n_features_
# an array with boolean values to indicate whether an attribute was selected 
using RFE
print("Selected Features: %s") % fit.support_
print("Feature Ranking: %s") % fit.ranking_

names = dataset.columns.values
print names
print "Features sorted by their rank:"
print sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names))

输出

Num Features: 1
Selected Features: [ True False False False False]
Feature Ranking: [1 2 3 4 5]
['R&D Spend' 'Administration' 'Marketing Spend' 'State' 'Profit']
Features sorted by their rank:
[(1, 'R&D Spend'), (2, 'Administration'), (3, 'Marketing Spend'), (4, 
'State'), (5, 'Profit')]

我对波士顿数据进行了尝试,它似乎有效。缩放是否在这里引起了问题?你能帮我了解应该应用什么样的缩放,我将如何在我未来的任务中确定它?

sc_X = StandardScaler().fit(X)
rescaledX = sc_X.fit_transform(X)


# Transform the Y based on the X Fittings.
rescaledY = sc_X.transform(Y)

# Using KFold 

from sklearn.model_selection import KFold
kfold =KFold(n_splits=5,random_state=1)

选择提升模型和交叉验证

from sklearn.model_selection import cross_val_score

model = GradientBoostingRegressor(n_estimators=100, random_state=1)

results = cross_val_score(model, rescaledX, rescaledY, cv=kfold)
print(results)

[-5.28213131 -2.73927962 -7.55241606 -2.5951924 -2.51933385]

我不明白,什么是结果。我认为它应该给出我模型的平均分数 - 请更正

【问题讨论】:

    标签: python machine-learning scikit-learn gradient-descent


    【解决方案1】:

    当梯度提升与线性回归一起完成时,它只不过是现有线性模型的另一个线性模型。这可以直观地理解为在已经找到的系数上加点东西,如果线性回归已经找到了最好的系数那就没有用了。

    使用线性回归的 boosting 方法有两个优点首先能够正则化系数的值并在过度拟合的情况下提供帮助。 其次是当数据具有某种非线性复杂形状时。 Boosting 方法有助于它随着数据缓慢发展。

    您的问题的另一个方面。如果您正在寻找线性回归的集成方法以一次使用多个模型,您可以寻找使用 glmnet 等软件包的正则化回归。您可以使用许多不同的模型进行预测并对它们的预测进行平均。

    【讨论】:

      【解决方案2】:

      只是线性回归不适合梯度提升。

      GB 是这样工作的:模型根据数据进行拟合,然后下一个模型建立在前一个模型的残差之上。但通常线性模型的残差不能与另一个线性模型拟合。

      而且,如果您构建了许多后续线性模型,它们仍然可以表示为单个线性模型(添加所有截距和系数)。

      【讨论】:

        猜你喜欢
        • 2016-10-31
        • 2017-05-08
        • 1970-01-01
        • 2018-05-19
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        相关资源
        最近更新 更多