我构建了以下滑雪板转换器:
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 )列‘4’的值'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 (变压器安装在其上)。
我一定是在正确建造这样一个变压器的路上遗漏了什么东西。
有人能给出一些关于如何修理变压器以使它得到适当的结果的线索吗?
谢谢。
发布于 2019-05-06 00:51:50
dic的定义应该发生在fit方法中;您希望基于传递给fit的数据访问速率。因此,您需要将dic设置为另一个类属性,以便在transform方法中引用。
(这种替换称为目标编码,在sklearn中可以使用现有的软件包进行替换。)
发布于 2019-05-06 12:33:24
考虑到本·雷尼格的回答,我对我的学习变压器做了一些修改:
class Cat2Rat( BaseEstimator , TransformerMixin ) :
def __init__( self , col2trans ) :
self._col2trans = col2trans
def fit( self , X , y = None ):
self._dic_col_p = {}
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 ] )
self._dic_col_p.update( { col : dic } )
return self
def transform( self , X , y = None ) :
for col , dic_p in self._dic_col_p.items() :
X.replace( { col : dic_p } , inplace = True )
return Xfit方法现在生成一个字典,其中包含包含列名称的键和包含每个列值的比例的值。
例如,self._dic_col_p在拟合后包含:
{ 'four' : {'w': 0.6, 'v': 0.4} , 'five' : {'c': 0.4, 'b': 0.4, 'a': 0.2} }其中:
myarray = np.array([ [ 1 , 1 , 3 , 'v' , 'a' , 0 ] ,
[ 2 , 2 , 2 , 'v' , 'b' , 1 ] ,
[ 4 , 5 , 1 , 'w' , 'c' , 1 ] ,
[ 2 , 1 , 9 , 'w' , 'c' , 1 ] ,
[ 1 , 0 , 4 , 'w' , 'b' , 1 ] ] )
colnames = [ 'one', 'two', 'three' , 'four' , 'five' , 'target' ]
df = pd.DataFrame( myarray , columns = colnames )泰克斯。
https://datascience.stackexchange.com/questions/51444
复制相似问题