2015-12-15 35 views
1

我似乎遇到了試圖將數字(連續)功能與因素結合起來的問題。我正在使用Pandas DataFrame輸入模型。現在,我的代碼工作與像「性別」,可以使用內置的變壓器很容易地轉化因素:如何在scikit-learn Pipelines中結合數字和分類特徵?

('gender', Pipeline([ 
('selector', ColumnSelector(column='gender')), 
('dict', DictTransformer()), 
('vect', DictVectorizer(sparse=False)) 
])) 

但是,當我試圖在結合了數字因子(如緯度)如下,

('latitude', Pipeline([ 
('selector', ColumnSelector(column='latitude')), 
('scaler', StandardScaler()) 
])) 

我得到一個錯誤:

ValueError: all the input arrays must have same number of dimensions

這裏是我的ColumnSelector()代碼:

class ColumnSelector(TransformerMixin): 
    """ 
    Class for building sklearn Pipeline step. This class should be used to select a column from a pandas data frame. 
    """ 

    def __init__(self, column): 
     self.column = column 

    def fit(self, x, y=None): 
     return self 

    def transform(self, data_frame): 
     return data_frame[self.column] 

顯然我錯過了重要的東西在這裏。有任何想法嗎?

+0

你能轉換的序列在管道的上下文之外工作嗎?管道可能會使故障排除更加困難 – Ryan

+0

我確信我可以做到這一點,但我可能必須這樣做,但這並不能解決此問題。與FeatureUnion結合的管道看起來非常方便,所以我想弄清楚如何使這項工作。 –

+0

這個錯誤究竟是從哪裏來的?文件/行號。另外,如果你想用不同的轉換器轉換每一列 - 看看http://stackoverflow.com/a/34202758/1030820 –

回答

1

使用Pipeline s在FeatureUnion應該工作。這裏的問題可能與執行ColumnSelector有關。請注意,它在每次轉換時輸出單維結構;然而,scikit-learn中的界面通常期望輸入2D形狀,即(n_sample, n_feature)

假設輸入到ColumnSelector是熊貓數據幀,嘗試代碼改變爲:

class ColumnSelector(TransformerMixin): 
    ... 

    def transform(self, data_frame): 
     return data_frame[[self.column]] 

這使得變換後的輸出以具有二維形狀。

在內部,FeatureUnion使用hstack來執行特徵矩陣的組合。這是導致hstack如問題描述抱怨的方式尺寸不符的小例子:

import numpy as np 
a = np.array([[1,0], 
       [0,1]]) 
b = np.array([2,3]) 
print np.hstack((a,b)) 
# ValueError: all the input arrays must have same number of dimensions 

然而,這個工程:

print np.hstack((a, b[:, np.newaxis])) 
# array([[1, 0, 2], 
#  [0, 1, 3]]) 

,因爲現在b[:, np.newaxis]有兩個維度。

+0

是的,這是問題和解決方法。謝謝! –

相關問題