我构建了以下 sklearn 转换器:
class Cat2Rat( BaseEstimator , TransformerMixin ) :
def __init__( self , col2trans ) :
self._col2trans = col2trans
def fit( self, X, y = None ):
return self
def transform( self , X , y = None ) :
for col in self._col2trans :
p = X[ col ].value_counts() / X.shape[0]
dic = dict( [ ( i , p[i] ) for i in ( X[ col ].value_counts() ).index ] )
X.replace( { col : dic } , inplace = True )
return X
这个变压器正在用它们的速率代替分类值。
例如 :
myarray = np.array([ [ 1 , 1 , 3 , 'v' , 0 ] ,
[ 2 , 2 , 2 , 'v' , 1 ] ,
[ 4 , 5 , 1 , 'w' , 1 ] ,
[ 2 , 1 , 9 , 'w' , 1 ] ,
[ 1 , 0 , 4 , 'w' , 1 ] ] )
colnames = [ 'one', 'two', 'three' , 'four' , 'target' ]
df = pd.DataFrame( myarray , columns = colnames )
列 'four' 的值 'v' ( 'w' ) 替换为 2/5 ( 3/5 )。
我的目的是将变压器安装在 df 上并将其应用于另一个数据帧 df2 :
myarray2 = np.array([ [ 2 , 7 , 3 , 'v' , 0 ] ,
[ 9 , 2 , 2 , 'v' , 0 ] ,
[ 4 , 5 , 1 , 'w' , 1 ] ] )
colnames2 = [ 'one', 'two', 'three' , 'four' , 'target' ]
df2 = pd.DataFrame( myarray2 , columns = colnames2 )
我这样做是这样的:
# Transformer instance
trsf = Cat2Rat( [ 'four' ] )
# Fitting
trsf.fit( df )
# Then applying
trsf.transform( df2 )
但费率是 df2 的“四”列值,而不是 df(安装了变压器)。
在正确构建这种变压器的过程中,我一定遗漏了一些东西。
有人可以就如何修复变压器提供一些线索,使其产生正确的结果吗?
谢谢。