首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >想要建造我自己的脱脂变压器有问题

想要建造我自己的脱脂变压器有问题
EN

Data Science用户
提问于 2019-05-05 17:39:44
回答 2查看 109关注 0票数 3

我构建了以下滑雪板转换器:

代码语言:javascript
复制
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

这台变压器正在用他们的费率来代替可怕的价值。

例如:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 )

我就是这样做的:

代码语言:javascript
复制
# Transformer instance
trsf = Cat2Rat( [ 'four' ] )

# Fitting
trsf.fit( df )

# Then applying
trsf.transform( df2 )

但是这个速率是df2列的‘四’值,而不是df (变压器安装在其上)。

我一定是在正确建造这样一个变压器的路上遗漏了什么东西。

有人能给出一些关于如何修理变压器以使它得到适当的结果的线索吗?

谢谢。

EN

回答 2

Data Science用户

回答已采纳

发布于 2019-05-06 00:51:50

dic的定义应该发生在fit方法中;您希望基于传递给fit的数据访问速率。因此,您需要将dic设置为另一个类属性,以便在transform方法中引用。

(这种替换称为目标编码,在sklearn中可以使用现有的软件包进行替换。)

票数 1
EN

Data Science用户

发布于 2019-05-06 12:33:24

考虑到本·雷尼格的回答,我对我的学习变压器做了一些修改:

代码语言:javascript
复制
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 X

fit方法现在生成一个字典,其中包含包含列名称的键和包含每个列值的比例的值。

例如,self._dic_col_p在拟合后包含:

代码语言:javascript
复制
{ 'four' : {'w': 0.6, 'v': 0.4} , 'five' : {'c': 0.4, 'b': 0.4, 'a': 0.2} }

其中:

代码语言:javascript
复制
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 )

泰克斯。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/51444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档