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

ctehm74n  于 2023-01-01  发布在  Python
关注(0)|答案(8)|浏览(123)

我使用scikit线性回归,如果我改变特征的顺序,系数仍然以相同的顺序打印,因此我想知道特征与系数的Map。

#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_
wko9yo5t

wko9yo5t1#

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

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数据框测试)
如果您想在以后重用这些系数,也可以将它们放入字典中:

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

(You我可以通过训练两个具有相同特征的模型来自己测试它,但正如您所说,特征的顺序被打乱了。)

uxh89sit

uxh89sit2#

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())
xriantvc

xriantvc3#

@Robin贴出了一个很棒的答案,但对我来说,我必须对它做一个调整才能按我想要的方式工作,它是引用我想要的'coef_' np.数组的维度,即修改为:模型_1.coef_[0,:],如下所示:

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

然后,dict就像我想象的那样被创建了,代码为{'feature_name':系数_值}对。

hof1towb

hof1towb4#

下面是我在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']))
fjaof16o

fjaof16o5#

借用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)]
zte4gxcn

zte4gxcn6#

pd.DataFrame(data=regression.coef_, index=X_train.columns)
tgabmvqs

tgabmvqs7#

所有这些答案都很棒,但对我个人来说,最有效的是这个,因为我需要的特性名称是train_date Dataframe 的列:

pd.DataFrame(data=model_1.coef_,columns=train_data.columns)
fhg3lkii

fhg3lkii8#

训练完模型后,系数值存储在变量model.coef_[0]中,我们可以迭代列名,并将列名及其系数值存储在字典中。

model.fit(X_train,y)
# assuming all the columns except last one is used in training
columns = data.iloc[:,-1].columns
dict = {}
for i in range(0,len(columns)):
  dict[columns[i]] = model.coef_[0][i]

希望这有帮助!

相关问题