请帮助我理解为什么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()
# 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]
我无法理解,结果是什么。我认为应该给出我模特的平均分数 - 请更正
答案 0 :(得分:2)
当梯度增强与线性回归一起完成时,它只不过是现有线性模型的另一个线性模型。这可以直观地理解为在已经找到的系数中添加一些东西,如果线性回归已经找到了最佳系数,那就没用了。
使用线性回归的增强方法有两个优点, first 能够规范系数值并帮助过度拟合。当数据具有某种非线性复杂形状时,第二。 Boosting方法可以帮助它随着数据的发展而缓慢发展。
您问题的另一个方面。如果您正在寻找用于线性回归的集合方法以一次使用多个模型,您可以使用像glmnet 这样的包来查找正则化回归。您可以使用许多不同的模型进行预测并对其预测进行平均。
答案 1 :(得分:0)
只是线性回归不适合Gradient Boosting。
GB以这种方式工作:模型适用于数据,然后下一个模型建立在先前模型的残差上。但通常线性模型的残差不能与另一个线性模型拟合。
如果你构建了许多后续的线性模型,它们仍然可以表示为单个线性模型(添加所有截距和系数)。