web-dev-qa-db-ja.com

scikit線形回帰を使用して係数の特徴名を見つける方法は?

#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は同じ順序で印刷されます。したがって、フィーチャと係数のマッピングを知りたい

16
amehta

秘Theは、モデルをトレーニングした直後に、係数の順序を知ることです。

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

(同じ機能を持つ2つのモデルをトレーニングすることで、自分でテストできますが、先ほど言ったように、機能の順序を入れ替えます。)

13
Robin Spiess

@Robinは素晴らしい答えを投稿しましたが、私にとっては、私が望んでいた方法で動作するように微調整する必要がありました。 model_1.coef_ [0 ,:]、以下のとおり:

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

それから、{'feature_name':efficient_value}のペアを使用して、私が描いたとおりに辞書を作成しました。

4
rocksteady

Jupyterで係数をきれいに印刷するために使用するものを次に示します。順序が問題になる理由を理解していない-係数の順序があなたが与えた入力データの順序と一致する必要があることを知っている限り。

最初の行では、回帰のためにnumpy配列に変換する前にデータを最初に保存したdfと呼ばれるPandasデータフレームがあることを前提としていることに注意してください。

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']))
0
user1761806

ロビンから借りましたが、構文を簡素化します。

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

Zipに関する重要な注意:Zipは入力が同じ長さであると想定しているため、特徴と係数の長さが一致していることを確認することが特に重要です(より複雑なモデルでは当てはまらない場合があります)。 1つの入力が他の入力よりも長い場合、長い入力の余分なインデックス位置の値は切り捨てられます。次の例で7が欠落していることに注意してください。

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