我正在编写用于分类的分类算法,并且正在通过MinMaxScaler()运行所有连续变量,以使它们的值范围为0-1。在培训和测试期间,我可以使用数据成功完成此操作。
我遇到的问题是预测时。而不是整个数据框,而是在我要进行预测的功能的单个行中加载。用于训练的功能的一个示例(在归一化归一化或因式分解之前)是:
lst = [50000,1, 1, 1,37,0,0,0,0,0,0,64400,57069,57608,19394,
19619,20024,2500,1815,657,1000,1000,800]
然后我将其转换为Series,然后转换为数据框,并使用以下代码进行转置:
ud_df = pd.Series(lst)
ud_df = ud_df.to_frame()
ud_df = ud_df.T
ud_df.columns= ['LIMIT_BAL', 'SEX', 'EDUCATION', 'MARRIAGE', 'AGE',
'PAY_0', 'PAY_2', 'PAY_3', 'PAY_4', 'PAY_5', 'PAY_6', 'BILL_AMT1',
'BILL_AMT2', 'BILL_AMT3',
'BILL_AMT4', 'BILL_AMT5', 'BILL_AMT6', 'PAY_AMT1', 'PAY_AMT2', 'PAY_AMT3',
'PAY_AMT4', 'PAY_AMT5', 'PAY_AMT6']
然后我将分类和数字数据类型分开。对于此示例,让我们假设数据帧ud_df包含所有连续值。
我想运行与训练集和测试集相同的MinMaxScaler()归一化:
scaler = preprocessing.MinMaxScaler().fit(ud_df)
var1 = scaler.transform(ud_df)
var1
运行此命令时,我得到全0:
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0.]])
还有其他方法可以像培训和测试集一样将整行标准化为0和1的范围吗?从概念上讲,如果我没记错的话,归一化所涉及的数学取决于整个列的最大值(我有3万行,因此可以为特定列找到最大值)。
任何帮助都会很棒!
答案 0 :(得分:1)
代码的问题是您正在为新的数据框使用MinMaxScaler的新实例,但是您需要使用已经应用于训练数据集的相同的scaler实例。其他一切都没有意义,因为您是根据训练数据集中已经使用的缩放比例训练模型的。如果您使用其他缩放器,那么如果新数据与训练数据在同一范围内,则训练后的模型将不适用于您的新数据(不要考虑缩放器对数据集不执行任何操作的情况)。
您在上面使用的缩放器只有一条记录。那行不通。更具体地说,缩放器也可能会引发错误(它不会但返回0)。如果您传入一个值,则该值同时是最小值和最大值,因此(value-min)/(max-min)实际上是0/0,因为value == max == min->不会锻炼。如果您有两个值,则较小的一个将缩放为0,较大的一个将缩放为1。 (smaller_value-smaller_value)/(bigger_value-smaller_value)-> 0和 (bigger_value-smaller_value)/(bigger_value-smaller_value)-> 1.仅当您拥有三个不同的值时,您才能在(0,1)之间得到一个值。
from sklearn import preprocessing
import pandas
train_set = pandas.DataFrame({'c':[1, 2, 3], 'b':[3, 2, 3]})
s = preprocessing.MinMaxScaler().fit(train_set)
s.transform(train_set)
manual_input = pandas.DataFrame({'c':[2], 'b':[2]})
# wrong
s2 = preprocessing.MinMaxScaler().fit(manual_input)
print(s2.transform(manual_input))
# right
print(s.transform(manual_input))
输出:
[[0. 0.]] # wrong scaler instance
[[0. 0.5]] # right scaler instance
您对manual_input中的值(范围最大为0且大于1)进行处理的方式取决于您的逻辑。也许您想将所有值都设置为0到0以下以及1到1以上,否则您的模型可能会发生无法预料的事情。从长远来看,您应该将这些值包括在模型训练中,或者在绝不考虑它们的情况下将它们过滤为离群值。