2016-10-02 8 views
4

Scikit-Learnから分散スレッショルドを実行した後、いくつかのフィーチャが削除されます。私は何かシンプルで愚かなことをしていると感じていますが、残っている機能の名前を残したいと思います。以下のコード:Scikitフィーチャ選択後のフィーチャ名の保持

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で非常に新しいので、おそらくちょうど何かばかげている。

+0

Scikit自体には、指定したカラム等と 'pandas'データ型をサポートしていませんので、あなたはscikitオブジェクトの' .transform'方法のようなものを使用して、いつでも、あなたはそのすべてを失うことになるだろう情報。別々にトラッキングすることができれば(つまり、記述したように列名を取得する)、新しいDataFrameを再作成した後に新しい列名を指定して戻すことができます。 – BrenBarn

答えて

7

う何か?あなたがパンダのデータフレームを渡すと、列を取得し、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 
>>> def VarianceThreshold_selector(data): 
    columns = data.columns 
    selector = VarianceThreshold(.5) 
    selector.fit_transform(data) 
    labels = [columns[x] for x in selector.get_support(indices=True) if x] 
    return pd.DataFrame(selector.fit_transform(data), columns=labels) 

>>> VarianceThreshold_selector(df) 
    Pclass Age 
0  3 22 
1  1 38 
2  3 26 
5

あり、これを行うには良い方法はおそらくですが、興味がある方のために、ここで私がやった方法は次のとおりです。このヘルプのような

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 
+1

私たちは基本的に同じ考えを持っていましたが、transformとfit_transformを使用した場合を除きました。あなたがそれを理解してうれしいです。 – Jarad

+0

私はPythonのnoobですが、 'features = data.columns.values [selector.get_support(indices = True)]'を実行するのも正しいでしょうか?あなたのアプローチを自分のデータで動かすことができませんでした。 – beldaz

1

私は、データフレームを返すためにtransform()またはfit_transform()を取得する方法を探してここに来たが、私はそれがサポートされていない疑いがあります。私はJaradによって機能を持ついくつかの問題を抱えていたとして、私は私が見つけたpteehanにより、溶液、とそれを混同している

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

しかし、あなたはこのようにもう少しきれいにデータをサブセットすることができますより信頼性が高い。また、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 
関連する問題