web-dev-qa-db-ja.com

Scikit機能選択後に機能名を保持

Scikit-Learnの一連のデータに対して分散しきい値を実行すると、いくつかの機能が削除されます。単純ながら愚かなことをしているように感じますが、残りの機能の名前は残しておきたいと思います。次のコード:

def VarianceThreshold_selector(data):
    selector = VarianceThreshold(.5) 
    selector.fit(data)
    selector = (pd.DataFrame(selector.transform(data)))
    return selector
x = VarianceThreshold_selector(data)
print(x)

次のデータを変更します(これは行の小さなサブセットです):

Survived    Pclass  Sex Age SibSp   Parch   Nonsense
0             3      1  22   1        0        0
1             1      2  38   1        0        0
1             3      2  26   0        0        0

これに(ここでも行の小さなサブセットのみ)

     0         1      2     3
0    3      22.0      1     0
1    1      38.0      1     0
2    3      26.0      0     0

Get_supportメソッドを使用して、これらがPclass、Age、Sibsp、およびParchであることを知っているので、これはむしろ次のようなものを返します。

     Pclass         Age      Sibsp     Parch
0        3          22.0         1         0
1        1          38.0         1         0
2        3          26.0         0         0

これを行う簡単な方法はありますか?私はScikit Learnに非常に慣れているので、おそらくばかげたことをしているだけでしょう。

13

このようなものは役に立ちますか? pandas dataframeを渡すと、列を取得し、前述のようにget_supportを使用して、インデックスで列リストを反復処理し、一致した列ヘッダーのみを引き出します分散しきい値。

>>> df
   Survived  Pclass  Sex  Age  SibSp  Parch  Nonsense
0         0       3    1   22      1      0         0
1         1       1    2   38      1      0         0
2         1       3    2   26      0      0         0

>>> from sklearn.feature_selection import VarianceThreshold
>>> def variance_threshold_selector(data, threshold=0.5):
    selector = VarianceThreshold(threshold)
    selector.fit(data)
    return data[data.columns[selector.get_support(indices=True)]]

>>> variance_threshold_selector(df, 0.5)
   Pclass  Age
0       3   22
1       1   38
2       3   26
>>> variance_threshold_selector(df, 0.9)
   Age
0   22
1   38
2   26
>>> variance_threshold_selector(df, 0.1)
   Survived  Pclass  Sex  Age  SibSp
0         0       3    1   22      1
1         1       1    2   38      1
2         1       3    2   26      0
19
Jarad

これを行うにはもっと良い方法があるでしょうが、興味のある人のためにここに私がやった方法があります:

def VarianceThreshold_selector(data):

    #Select Model
    selector = VarianceThreshold(0) #Defaults to 0.0, e.g. only remove features with the same value in all samples

    #Fit the Model
    selector.fit(data)
    features = selector.get_support(indices = True) #returns an array of integers corresponding to nonremoved features
    features = [column for column in data[features]] #Array of all nonremoved features' names

    #Format and Return
    selector = pd.DataFrame(selector.transform(data))
    selector.columns = features
    return selector

transform()またはfit_transform()を取得してデータフレームを返す方法を探してここに来ましたが、サポートされていないようです。

ただし、次のようにデータをもう少しきれいにサブセット化できます。

data_transformed = data.loc[:, selector.get_support()]
5
pteehan

Jaradの関数にいくつか問題があったので、pteehanの解決策と混同しました。また、VarianceThresholdはNA値を好まないため、NA置換を標準として追加しました。

def variance_threshold_select(df, thresh=0.0, na_replacement=-999):
    df1 = df.copy(deep=True) # Make a deep copy of the dataframe
    selector = VarianceThreshold(thresh)
    selector.fit(df1.fillna(na_replacement)) # Fill NA values as VarianceThreshold cannot deal with those
    df2 = df.loc[:,selector.get_support(indices=False)] # Get new dataframe with columns deleted that have NA values

    return df2
2
Jan Janiszewski

Pandasをしきい値設定にも使用できます

data_new = data.loc[:, data.std(axis=0) > 0.75]
0
SaTa