为什么Gradient Boosting不能在线性回归中工作?

时间:2017-07-31 06:48:56

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

请帮助我理解为什么Gradient Boosting技术不起作用。是GB在内部使用决策树回归[混淆请澄清]。我正在尝试使用整体技术来获得当前数据集的最佳分数。此外,似乎存在递归特征消除[RFE]的问题,来自SKLearn的核心化矩阵直觉和RFE应该产生类似的特征重要性。 请帮助我理解,来自SKLearn的递归特征消除[RFE],相关矩阵直觉和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))

协同关系矩阵明确表明R& D Spend对预测利润[标签]具有最高意义,其次是营销支出?

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

Co-Relation Scatter Plot Matrix

# 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]]

首先,即使正确给出了R& D支出,也应该遵循营销支出?另外,为什么Profit是选择的一部分,因为我在线性回归拟合中明确地将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')]

我为波士顿数据尝试了这一点,它似乎正在发挥作用。 Scaling在这里引起了一个问题吗?你能帮我理解应该应用什么样的缩放,以及我将来如何确定它?

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)

选择Boosting模型和交叉验证

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]

我无法理解,结果是什么。我认为应该给出我模特的平均分数 - 请更正

2 个答案:

答案 0 :(得分:2)

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

使用线性回归的增强方法有两个优点 first 能够规范系数值并帮助过度拟合。当数据具有某种非线性复杂形状时,第二。 Boosting方法可以帮助它随着数据的发展而缓慢发展。

您问题的另一个方面。如果您正在寻找用于线性回归的集合方法以一次使用多个模型,您可以使用像glmnet 这样的包来查找正则化回归。您可以使用许多不同的模型进行预测并对其预测进行平均。

答案 1 :(得分:0)

只是线性回归不适合Gradient Boosting。

GB以这种方式工作:模型适用于数据,然后下一个模型建立在先前模型的残差上。但通常线性模型的残差不能与另一个线性模型拟合。

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