web-dev-qa-db-fra.com

Comment trouver les noms des caractéristiques des coefficients à l'aide de la régression linéaire 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_

Si je change l'ordre des entités, les coef sont toujours imprimés dans le même ordre, c'est pourquoi j'aimerais connaître la cartographie de l'entité avec le coeff

12
amehta

Le truc, c'est que juste après avoir formé votre modèle, vous connaissez l'ordre des coefficients:

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

Cela imprimera les coefficients et la fonction correcte. (Testé avec Pandas DataFrame)

Si vous souhaitez réutiliser les coefficients ultérieurement, vous pouvez également les mettre dans un dictionnaire:

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

(Vous pouvez le tester vous-même en entraînant deux modèles dotés des mêmes fonctionnalités mais, comme vous l'avez dit, en mélangeant l'ordre des fonctionnalités.)

11
Robin Spiess

@Robin a posté une excellente réponse, mais pour moi, je devais faire un Tweak dessus pour que je puisse travailler comme je le voulais, et c'était pour faire référence à la dimension du "coef_" np.array que je voulais, en modifiant ceci: model_1.coef_ [0 ,:], comme ci-dessous:

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

Ensuite, le dict a été créé comme je l’ai imaginé, avec des paires {'feature_name': coefficient_value}.

2
rocksteady

Voici ce que j’utilise pour imprimer de jolis coefficients dans Jupyter. Je ne suis pas sûr de comprendre pourquoi l'ordre est un problème - pour autant que je sache, l'ordre des coefficients doit correspondre à l'ordre des données d'entrée que vous avez données. 

Notez que la première ligne suppose que vous avez un cadre de données Pandas appelé df dans lequel vous avez initialement stocké les données avant de les transformer en tableau numpy pour la régression:

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

Emprunter à Robin, mais en simplifiant la syntaxe:

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

Remarque importante à propos de Zip: Zip suppose que ses entrées ont une longueur égale, d'où l'importance de confirmer que les longueurs des caractéristiques et des coefficients correspondent (ce qui peut ne pas être le cas dans les modèles plus complexes). Si une entrée est plus longue que l'autre, l'entrée la plus longue aura les valeurs dans ses positions d'index supplémentaires coupées. Notez le 7 manquant dans l'exemple suivant:

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