如何使用scikit线性回归找到系数的特征名称?

时间:2016-01-07 07:58:04

标签: python machine-learning scikit-learn linear-regression

#training the model
model_1_features = ['sqft_living', 'bathrooms', 'bedrooms', 'lat', 'long']
model_2_features = model_1_features + ['bed_bath_rooms']
model_3_features = model_2_features + ['bedrooms_squared', 'log_sqft_living', 'lat_plus_long']

model_1 = linear_model.LinearRegression()
model_1.fit(train_data[model_1_features], train_data['price'])

model_2 = linear_model.LinearRegression()
model_2.fit(train_data[model_2_features], train_data['price'])

model_3 = linear_model.LinearRegression()
model_3.fit(train_data[model_3_features], train_data['price'])

# extracting the coef
print model_1.coef_
print model_2.coef_
print model_3.coef_

如果我更改了要素的顺序,则coef仍以相同的顺序打印,因此我想知道该要素与coeff的映射

5 个答案:

答案 0 :(得分:11)

诀窍在于,在训练模型后,您就知道了系数的顺序:

model_1 = linear_model.LinearRegression()
model_1.fit(train_data[model_1_features], train_data['price'])
print(list(zip(model_1.coef_, model_1_features)))

这将打印系数和正确的功能。 (使用pandas DataFrame测试)

如果您想稍后重复使用这些系数,您也可以将它们放在字典中:

coef_dict = {}
for coef, feat in zip(model_1.coef_,model_1_features):
    coef_dict[feat] = coef

(你可以通过训练两个具有相同功能的模型来测试它,但正如你所说的那样,改进了功能的顺序。)

答案 1 :(得分:4)

import pandas as pd

import numpy as np

from sklearn.linear_model import LinearRegression

regressor = LinearRegression()
regressor.fit(X_train, y_train)

coef_table = pd.DataFrame(list(X_train.columns)).copy()
coef_table.insert(len(coef_table.columns),"Coefs",regressor.coef_.transpose())

答案 2 :(得分:3)

@Robin发布了一个很好的答案,但是对我来说,我必须对其进行一个调整才能按照我想要的方式工作,它是指我想要的'coef_'np.array的尺寸,即修改为此:model_1.coef_ [0 ,:],如下所示:

addsTo2 = (n1, n2) => {
    return n1 + n2 === 2 ? `yes, ${n1} + ${n2} is 2`: `no, ${n1} + ${n2} is ${n1 + n2} instead`;
}
result = addsTo2(1,1)
// outputs > "yes, 1 + 1 is 2"
result = addsTo2(1,3)
// outputs > "no, 1 + 3 is 4 instead"

然后按照我的图片创建字典,其中包含{'feature_name':系数_值}对。

答案 3 :(得分:0)

这是我在Jupyter中用于漂亮系数打印的方法。我不确定我遵循为什么订单是一个问题 - 据我所知,系数的顺序应该与你给它的输入数据的顺序相匹配。

请注意,第一行假设您有一个名为df的Pandas数据框,您最初在将数据转换为numpy数组进行回归之前存储数据:

fieldList = np.array(list(df)).reshape(-1,1)

coeffs = np.reshape(np.round(clf.coef_,5),(-1,1))
coeffs=np.concatenate((fieldList,coeffs),axis=1)
print(pd.DataFrame(coeffs,columns=['Field','Coeff']))

答案 4 :(得分:0)

借用Robin,但简化了语法:

coef_dict = dict(zip(model_1_features, model_1.coef_))

关于zip的重要说明:zip假定其输入长度相等,因此特别重要的是确认特征和系数的长度匹配(在更复杂的模型中可能并非如此)。如果一个输入比另一个输入长,则较长的输入将在其额外索引位置中截断值。请注意以下示例中缺少的7:

In [1]: [i for i in zip([1, 2, 3], [4, 5, 6, 7])]
Out[1]: [(1, 4), (2, 5), (3, 6)]