webentwicklung-frage-antwort-db.com.de

Wie finde ich die Merkmalsnamen der Koeffizienten mithilfe der linearen Regression von 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_

Wenn ich die Reihenfolge der Features ändere, wird der Coef immer noch in derselben Reihenfolge gedruckt, daher würde ich gerne wissen, wie das Feature mit dem Koeffizienten abbildet

12
amehta

Der Trick ist, dass Sie direkt nach dem Trainieren Ihres Modells die Reihenfolge der Koeffizienten kennen:

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

Dadurch werden die Koeffizienten und die korrekte Funktion gedruckt. (Getestet mit Pandas DataFrame)

Wenn Sie die Koeffizienten später wiederverwenden möchten, können Sie sie auch in ein Wörterbuch einfügen:

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

(Sie können es selbst testen, indem Sie zwei Modelle mit den gleichen Funktionen trainieren, aber, wie Sie sagten, die Reihenfolge der Funktionen neu gemischt.)

11
Robin Spiess

@Robin hat eine großartige Antwort gepostet, aber für mich musste ich einen Tweak daran machen, um so zu arbeiten, wie ich wollte, und es war auf die Dimension des 'coef_' np.array hinzuweisen, das ich wollte, nämlich zu diesem Zweck: model_1.coef_ [0 ,:] wie folgt:

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

Dann wurde das Diktat so erstellt, wie ich es mir vorgestellt hatte, mit {'feature_name': factor_value} -Paaren.

2
rocksteady

Hier ist das, was ich für das hübsche Drucken von Koeffizienten in Jupyter verwende. Ich bin mir nicht sicher, ob ich folge, warum die Reihenfolge ein Problem ist - soweit ich weiß, sollte die Reihenfolge der Koeffizienten mit der Reihenfolge der Eingabedaten übereinstimmen, die Sie ihm gegeben haben. 

Beachten Sie, dass in der ersten Zeile ein Pandas-Datenframe namens df verwendet wird, in dem Sie die Daten ursprünglich gespeichert haben, bevor Sie sie in ein numpy-Array für die Regression umwandeln:

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

Von Robin geliehen, aber die Syntax vereinfacht:

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

Wichtiger Hinweis zu Zip: Zip geht davon aus, dass seine Eingaben gleich lang sind. Daher ist es besonders wichtig zu bestätigen, dass die Längen der Features und Koeffizienten übereinstimmen (was bei komplizierteren Modellen möglicherweise nicht der Fall ist). Wenn ein Eingang länger ist als der andere, werden die Werte an den zusätzlichen Indexpositionen des längeren Eingangs abgeschnitten. Beachten Sie die fehlende 7 im folgenden Beispiel:

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