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に非常に慣れているので、おそらくばかげたことをしているだけでしょう。
このようなものは役に立ちますか? 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
これを行うにはもっと良い方法があるでしょうが、興味のある人のためにここに私がやった方法があります:
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()]
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
Pandasをしきい値設定にも使用できます
data_new = data.loc[:, data.std(axis=0) > 0.75]