Python 缩放数据时,为什么列车数据集使用';适合';和';转换';,但测试数据集仅使用';转换';?
缩放数据时,为什么列车数据集使用“拟合”和“变换”,而测试数据集仅使用“变换”Python 缩放数据时,为什么列车数据集使用';适合';和';转换';,但测试数据集仅使用';转换';?,python,scikit-learn,Python,Scikit Learn,缩放数据时,为什么列车数据集使用“拟合”和“变换”,而测试数据集仅使用“变换” SAMPLE_COUNT = 5000 TEST_COUNT = 20000 seed(0) sample = list() test_sample = list() for index, line in enumerate(open('covtype.data','rb')): if index < SAMPLE_COUNT: sample.append(line) else:
SAMPLE_COUNT = 5000
TEST_COUNT = 20000
seed(0)
sample = list()
test_sample = list()
for index, line in enumerate(open('covtype.data','rb')):
if index < SAMPLE_COUNT:
sample.append(line)
else:
r = randint(0,index)
if r < SAMPLE_COUNT:
sample[r] = line
else:
k = randint(0,index)
if k < TEST_COUNT:
if len(test_sample) < TEST_COUNT:
test_sample.append(line)
else:
test_sample[k] = line
from sklearn.preprocessing import StandardScaler
for n, line in enumerate(sample):
sample[n] = map(float, line.strip().split(','))
y = np.array(sample)[:,-1]
scaling = StandardScaler()
X = scaling.fit_transform(np.array(sample)[:,:-1]) ##here use fit and transform
for n,line in enumerate(test_sample):
test_sample[n] = map(float,line.strip().split(','))
yt = np.array(test_sample)[:,-1]
Xt = scaling.transform(np.array(test_sample)[:,:-1])##why here only use transform
SAMPLE\u COUNT=5000
测试计数=20000
种子(0)
示例=列表()
测试样本=列表()
对于索引,枚举中的行(open('covtype.data','rb'):
如果索引<样本计数:
sample.append(行)
其他:
r=randint(0,索引)
如果r<样本计数:
样本[r]=行
其他:
k=randint(0,索引)
如果k<测试计数:
如果len(测试样本)<测试计数:
测试样本追加(行)
其他:
测试样本[k]=线
从sklearn.preprocessing导入StandardScaler
对于n,枚举中的行(示例):
示例[n]=map(float,line.strip().split(','))
y=np.数组(样本)[:,-1]
scaling=StandardScaler()
X=scaling.fit_变换(np.array(sample)[:,:-1])##这里使用fit和transform
对于n,枚举中的行(测试样本):
test_sample[n]=map(float,line.strip().split(','))
yt=np.数组(测试样本)[:,-1]
Xt=scaling.transform(np.array(test_sample)[:,:-1])##为什么这里只使用transform
正如注释所述,为什么Xt只使用变换而不使用拟合?我们使用fit()
或fit\u transform()
来学习(训练模型)列车数据集transform()
可用于针对测试数据集的训练模型。我们对列车数据使用fit_transform()
,以便我们了解列车数据的缩放参数,同时缩放列车数据。
我们仅在测试数据上使用transform()
,因为我们使用在列车数据上学习的缩放参数来缩放测试数据
这是按比例进行的标准程序。您总是在火车上学习缩放参数,然后在测试中使用它们。这里有一篇文章对此做了很好的解释:fit()用于计算转换所需的参数,transform()用于缩放数据以转换为模型的标准格式
fit_tranform()是两个函数的组合,这两个函数可以有效地完成上述工作
因为fit_transform()已经在计算和转换训练数据,所以只剩下测试数据的转换,因为已经计算并存储了转换所需的参数,所以只剩下测试数据的转换(),因此只使用transform()而不是fit_transform() 我们有两个数据集:训练数据集和测试数据集。假设我们只有两个功能: “x1”和“x2”
现在考虑这个(一个非常假设的例子):
训练数据中的样本具有值:“x1”=100和“x2”=200 缩放时,“x1”的值为0.1,“x2”的值也为0.1。对此,响应变量值为100。这些数据仅通过训练数据的平均值和标准值进行计算 测试数据中的样本值为:“x1”=50,“x2”=100。当根据试验数据值进行缩放时,'x1'=0.1和'x2'=0.1。这意味着我们的函数也将预测该样本的响应变量值100。但这是错误的。不应该是100。由于上述两个样本特征的非标度值不同,因此指向不同的响应值,因此应预测其他情况。只有当我们根据训练数据对其进行缩放时,我们才会知道正确的预测是什么,因为这些是我们的线性回归函数已经学习到的值 我试图在下面解释这一逻辑背后的直觉: 在应用线性回归和拟合线性回归函数之前,我们决定对训练数据集中的两个特征进行缩放。当我们缩放训练数据集的特征时,所有“x1”特征根据不同样本的平均值和标准偏差w.r.t调整为其“x1”特征值。“x2”特性也会发生同样的情况。 这本质上意味着,每个特征都已转换为仅基于训练数据的新数字。好像每个特征都有一个相对的位置。相对于训练数据的平均值和标准差。因此,每个样本的新“x1”和“x2”值仅取决于训练数据的平均值和标准差 现在,当我们拟合线性回归函数时,它会根据训练数据集的缩放特征学习参数(即,学习预测响应值)。这意味着它正在学习根据训练数据集中不同样本的“x1”和“x2”的特定平均值和标准偏差进行预测。因此,预测值取决于: *学习参数。而这又取决于 *训练数据的特征值(已缩放)。由于缩放,训练数据的特征取决于 *训练数据的平均值和标准如果我们现在将standardscaler()拟合到测试数据,测试数据的'x1'和'x2'将有自己的平均值和标准。这意味着这两个特征的新值将反过来仅与测试数据中的数据相关,因此与训练数据没有任何联系。这几乎就像它们被随机值减去或除以,现在得到了新的值,而这些值并不能表达它们与训练数据的关系 可能有两种方法: 具有拟合和转换列车数据的第一进近比例,仅转换测试数据 第二次安装和改造整套设备:培训+测试 如果您想一想:模型在上线时将如何处理缩放?:当新数据到达时,新数据的行为将与回测中看不见的测试数据一样 在第一种情况下,新数据将仅进行缩放转换,并且您的mod