web-dev-qa-db-ja.com

sklearnロジスティック回帰-重要な機能

以前に尋ねられたと確信していますが、答えを見つけることができません

Pythonでsklearnを使用してロジスティック回帰を実行すると、Transformメソッドを使用してデータセットを最も重要な機能に変換できます

classf = linear_model.LogisticRegression()
func  = classf.fit(Xtrain, ytrain)
reduced_train = func.transform(Xtrain)

どの機能が最も重要なものとして選択されたかをどのようにして知ることができますか?より一般的には、データセット内の各特徴のp値をどのように計算できますか?

13
mel

上記のコメントで提案されているように、フィットする前にデータをスケーリングして、係数を比較可能にすることができます(すべきです)。以下は、これがどのように機能するかを示す小さなコードです。比較のために this 形式に従います。

import numpy as np    
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt

x1 = np.random.randn(100)
x2 = np.random.randn(100)
x3 = np.random.randn(100)

#Make difference in feature dependance
y = (3 + x1 + 2*x2 + 5*x3 + 0.2*np.random.randn()) > 0

X = pd.DataFrame({'x1':x1,'x2':x2,'x3':x3})

#Scale your data
scaler = StandardScaler()
scaler.fit(X) 
X_scaled = pd.DataFrame(scaler.transform(X),columns = X.columns)

clf = LogisticRegression(random_state = 0)
clf.fit(X_scaled, y)

feature_importance = abs(clf.coef_[0])
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + .5

featfig = plt.figure()
featax = featfig.add_subplot(1, 1, 1)
featax.barh(pos, feature_importance[sorted_idx], align='center')
featax.set_yticks(pos)
featax.set_yticklabels(np.array(X.columns)[sorted_idx], fontsize=8)
featax.set_xlabel('Relative Feature Importance')

plt.tight_layout()   
plt.show()
6
Keith

LogisticRegression.transformは、保持する機能を決定するthreshold値を取ります。 docstringから直接:

しきい値:文字列、浮動小数点数、またはなし、オプション(デフォルト=なし)機能の選択に使用するしきい値。重要度がそれ以上の機能は保持され、他の機能は破棄されます。 「中央値」(または「平均」)の場合、しきい値は機能の重要度の中央値(または平均)です。スケーリング係数(たとえば、「1.25 *平均」)も使用できます。 Noneが利用可能な場合、オブジェクト属性thresholdが使用されます。それ以外の場合は、デフォルトで「平均」が使用されます。

LR推定器にはオブジェクト属性thresholdがないため、平均よりも絶対値​​が高い(クラス全体で合計した)特徴のみがデフォルトで保持されます。

4
Fred Foo

coef_適合モデルの属性。どの機能が最も重要かを確認します。 (LogisticRegressionの場合、transformが実行しているのは、絶対値が最も高い係数を調べることです。)

ほとんどのscikit-learnモデルには、p値を計算する方法がありません。大まかに言って、これらのモデルは実際に出力を予測するために使用されるように設計されており、予測がどのように行われるかについて理解を収集するために検査されることはありません。 p値に興味がある場合は、 statsmodels を参照してください。ただし、sklearnよりも成熟度は低いです。

3
BrenBarn