scikit-learn中fit_transform()与transform()的区别

scikit-learn中fit_transform()与transform()到底有什么区别,能不能混用?

  • 二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)
  • fit_transform(partData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该partData进行转换transform,从而实现数据的标准化、归一化等等。。
  • 根据对之前部分fit的整体指标,对剩余的数据(restData)使用同样的均值、方差、最大最小值等指标进行转换transform(restData),从而保证part、rest处理方式相同。
  • 必须先用fit_transform(partData),之后再transform(restData)
  • 如果直接transform(partData),程序会报错
  • 如果fit_transfrom(partData)后,使用fit_transform(restData)而不用transform(restData),虽然也能归一化,但是两个结果不是在同一个“标准”下的,具有明显差异。


    实验:

    使用preprocessing.MinMaxScaler()对象对数据进行归一化。原理是:(x-xMin)/(xMax - xMin),从而将所有数据映射到【0,1】区间。


    import numpy as np 
    
    from sklearn.preprocessing import MinMaxScaler
    
    data = np.array(np.random.randint(-100,100,24).reshape(6,4))
    
    data
    Out[55]: 
    array([[ 68, -63, -31, -10],
           [ 49, -49,  73,  18],
           [ 46,  65,  75, -78],
           [-72,  30,  90, -80],
           [ 95, -88,  79, -49],
           [ 34, -81,  57,  83]])
    
    train = data[:4]
    
    test = data[4:]
    
    train
    Out[58]: 
    array([[ 68, -63, -31, -10],
           [ 49, -49,  73,  18],
           [ 46,  65,  75, -78],
           [-72,  30,  90, -80]])
    
    test
    Out[59]: 
    array([[ 95, -88,  79, -49],
           [ 34, -81,  57,  83]])
    
    minmaxTransformer = MinMaxScaler(feature_range=(0,1))
    
    #先对train用fit_transformer(),包括拟合fit找到xMin,xMax,再transform归一化
    train_transformer = minmaxTransformer.fit_transform(train)
    
    #根据train集合的xMin,xMax,对test集合进行归一化transform.
    #(如果test中的某个值比之前的xMin还要小,依然用原来的xMin;同理如果test中的某个值比之前的xMax还要大,依然用原来的xMax.
    #所以,对test集合用同样的xMin和xMax,**有可能不再映射到【0,1】**)
    test_transformer = minmaxTransformer.transform(test)
    
    train_transformer
    Out[64]: 
    array([[ 1.        ,  0.        ,  0.        ,  0.71428571],
           [ 0.86428571,  0.109375  ,  0.85950413,  1.        ],
           [ 0.84285714,  1.        ,  0.87603306,  0.02040816],
           [ 0.        ,  0.7265625 ,  1.        ,  0.        ]])
    
    test_transformer
    Out[65]: 
    array([[ 1.19285714, -0.1953125 ,  0.90909091,  0.31632653],
           [ 0.75714286, -0.140625  ,  0.72727273,  1.66326531]])
    
    #如果少了fit环节,直接transform(partData),则会报错
    
    minmaxTransformer = MinMaxScaler(feature_range=(0,1))
    
    train_transformer2 = minmaxTransformer.transform(train)
    Traceback (most recent call last):
    
      File "<ipython-input-68-a2aeaf2132be>", line 1, in <module>
        train_transformer2 = minmaxTransformer.transform(train)
    
      File "D:\Program Files\Anaconda3\lib\site-packages\sklearn\preprocessing\data.py", line 352, in transform
        check_is_fitted(self, 'scale_')
    
      File "D:\Program Files\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 690, in check_is_fitted
        raise _NotFittedError(msg % {'name': type(estimator).__name__})
    
    NotFittedError: This MinMaxScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.
    
    #如果对test也用fit_transform(),则结果跟之前不一样。对于许多机器学习算法来说,对于train和test的处理应该统一。
    
    test_transformer2 = minmaxTransformer.fit_transform(test)
    
    test_transformer2
    Out[71]: 
    array([[ 1.,  0.,  1.,  0.],
           [ 0.,  1.,  0.,  1.]])
    
    test_transformer
    Out[72]: 
    array([[ 1.19285714, -0.1953125 ,  0.90909091,  0.31632653],
           [ 0.75714286, -0.140625  ,  0.72727273,  1.66326531]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值