2016-09-09 2 views
1

データフレームのすべてのfloat64列でDataFrameMapper Imputer + Scalerマッピングを使用します。私のコードはStandardScalerで動作しますが、Imputerを追加すると、マッパーはすべてのゼロが1行だけを返します。データフレーム上のDataFrameMapperでImputerを使用するには?

私はこの質問 Imputer on some Dataframe columns in Pythonとチュートリアルhttps://github.com/paulgb/sklearn-pandasを見て、警告があります:

のsite-packages \ sklearn \ utilsの\ validation.py:386:DeprecationWarning:データが推奨されませんよう は1D配列を渡すには、 0.17と値上がりで 0.19のValueError。 データに単一のフィーチャーがある場合はX.reshape(-1、1)、または単一サンプルが の場合はX.reshape(1、-1)を使用してデータを再整形します。

私は形状の不一致があることを理解しています。以下の例のデータフレームは、どのように再構成する必要がありますか?

import pandas as pd 
import numpy as np 
from sklearn_pandas import DataFrameMapper 
from sklearn.preprocessing import StandardScaler, Imputer 

# just a random dataframe from http://pandas.pydata.org/pandas-docs/stable/10min.html 
dates = pd.date_range('20130101', periods=6) 
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) 

print "Starting with a random dataframe of 6 rows and 4 columns of floats:" 
print df.shape 
print df 

mapping=[('A', [Imputer(), StandardScaler()]), ('C', [Imputer(), StandardScaler()])] 
mapper = DataFrameMapper(mapping) 

result = mapper.fit_transform(df) 

print "I get an unexpected result of all zeroes in just one row." 
print result.shape 
print result 

print "Expected is a dataframe of 2 columns and 6 rows of scaled floats." 
print "something like this:" 

mapping=[('A', [StandardScaler()]), ('C', [StandardScaler()])] 
mapper = DataFrameMapper(mapping) 

result_scaler = mapper.fit_transform(df) 
print result_scaler.shape 
print result_scaler 

この出力

Starting with a random dataframe of 6 rows and 4 columns of floats. 
(6, 4) 
        A   B   C   D 
2013-01-01 -0.070551 0.039074 0.513491 -0.830585 
2013-01-02 -0.313069 -1.028936 2.359338 -0.830518 
2013-01-03 -1.264926 -0.830575 0.461515 0.427228 
2013-01-04 -0.374400 0.619986 0.318128 0.361712 
2013-01-05 -0.235587 -1.647786 -0.819940 -1.036435 
2013-01-06 1.436073 0.312183 1.566990 -0.272224 
Unexpected result is all zeroes in just one row. 
(1L, 12L) 
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] 
Expected is a dataframe of 2 columns and 6 rows of scaled floats. 
something like this 
(6L, 2L) 
[[ 0.08306789 -0.21892275] 
[-0.21975387 1.61986719] 
[-1.40829622 -0.27069922] 
[-0.29633508 -0.4135387 ] 
[-0.12300572 -1.54725542] 
[ 1.964323 0.83054889]] 

そしてフォローアップの質問は - 私のオリジナルデータフレームはフロート、ブール値とオブジェクト(ラベル)の組み合わせです。私は

floats = list(df.select_dtypes(include=['float64']).columns) 
mapping=[(f, [Imputer(missing_values=0,strategy="mean"), StandardScaler()]) for f in floats] 

のリストを持っているときにどのように私はちょうどそれらの列のために(Imputerのためにそれを形作る)データフレームを準備するだろうか?

答えて

1

標準のImputerはDataFrameMapperで動作しません。これは、DataFrameMapperの入出力の方向が、予想されるものの転置であるためです。 Imputer周りのラッパークラスを作成すると、問題を解決する必要があります:

from sklearn.preprocessing import Imputer 


class SeriesImputer(Imputer): 
    def fit(self, X, y=None): 
     return super(SeriesImputer, self).fit(X.reshape(-1, 1), y=y) 

    def transform(self, X): 
     return super(SeriesImputer, self).transform(X.reshape(-1, 1)) 

そして、単にDataFrameMapperでSeriesImputerでImputerの発生を置き換えます。

関連する問題