2014-07-13 33 views
7

Tôi so sánh scaler Min-Max scikit-learning từ mô-đun preprocessing với phương pháp "thủ công" bằng NumPy. Tuy nhiên, tôi nhận thấy rằng kết quả hơi khác. Có ai có một lời giải thích cho điều này?scikit-learn MinMaxScaler tạo ra các kết quả hơi khác so với việc thực hiện NumPy

Sử dụng phương trình sau đây cho Min-Max rộng:

enter image description here

mà nên giống như scikit-học một: (X - X.min(axis=0))/(X.max(axis=0) - X.min(axis=0))

Tôi đang sử dụng cả hai phương pháp tiếp cận như sau:

def numpy_minmax(X): 
    xmin = X.min() 
    return (X - xmin)/(X.max() - xmin) 

def sci_minmax(X): 
    minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True) 
    return minmax_scale.fit_transform(X) 

Trên mẫu ngẫu nhiên:

import numpy as np 

np.random.seed(123) 

# A random 2D-array ranging from 0-100 

X = np.random.rand(100,2) 
X.dtype = np.float64 
X *= 100 

Kết quả là hơi khác nhau:

from matplotlib import pyplot as plt 

sci_mm = sci_minmax(X) 
numpy_mm = numpy_minmax(X) 

plt.scatter(numpy_mm[:,0], numpy_mm[:,1], 
     color='g', 
     label='NumPy bottom-up', 
     alpha=0.5, 
     marker='o' 
     ) 

plt.scatter(sci_mm[:,0], sci_mm[:,1], 
     color='b', 
     label='scikit-learn', 
     alpha=0.5, 
     marker='x' 
     ) 

plt.legend() 
plt.grid() 

plt.show() 

enter image description here

Trả lời

10

scikit-learn quá trình mỗi đặc trưng riêng. Vì vậy, bạn cần phải xác định axis=0 khi chụp min, nếu không numpy.min sẽ là phút trên tất cả các yếu tố của mảng, không từng cột riêng biệt:

>>> xs 
array([[1, 2], 
     [3, 4]]) 
>>> xs.min() 
1 
>>> xs.min(axis=0) 
array([1, 2]) 

điều tương tự cho numpy.max; vì vậy các chức năng đúng sẽ là:

def numpy_minmax(X): 
    xmin = X.min(axis=0) 
    return (X - xmin)/(X.max(axis=0) - xmin) 

Làm như vậy bạn sẽ nhận được một kết hợp chính xác:

exact match

+1

Đó là tuyệt vời, cảm ơn! – Sebastian

Các vấn đề liên quan