在构建模型之前,必须准备好您的数据。 数据准备过程可以包括三个步骤:数据选择、数据预处理和数据转换。
在本教程中,您将学习两种简单的数据转换方法,您可以在 Python 中使用 scikit-learn 应用于您的数据。
立即开始您的项目,阅读我的新书《机器学习数据准备》,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。
更新:请参阅此帖子以获取更现代的示例集。

数据重新缩放
照片由 Quinn Dombrowski 提供,部分权利保留。
数据重新缩放
预处理后的数据可能包含属性,这些属性具有各种数量的混合比例,例如美元、千克和销售量。
许多机器学习方法都期望或在数据属性具有相同比例时更有效。两种流行的数据缩放方法是**归一化**和**标准化**。
想开始学习数据准备吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
数据归一化
归一化是指将实值数值属性重新缩放到 0 和 1 之间的范围。
缩放模型的输入属性非常有用,这些模型依赖于值的幅度,例如 k-近邻使用的距离度量以及回归系数的准备。
下面的示例演示了 Iris 花卉数据集的数据归一化。
1 2 3 4 5 6 7 8 9 10 11 |
# 对 Iris 数据集的数据属性进行归一化。 from sklearn.datasets import load_iris from sklearn import preprocessing # 加载iris数据集 iris = load_iris() print(iris.data.shape) # 分离数据和目标属性 X = iris.data y = iris.target # 对数据属性进行归一化 normalized_X = preprocessing.normalize(X) |
有关更多信息,请参阅 API 文档中的 normalize 函数。
数据标准化
标准化是指将每个属性的分布移位,使其均值为零且标准差为一(单位方差)。
标准化属性对于依赖属性分布的模型(例如高斯过程)非常有用。
下面的示例演示了 Iris 花卉数据集的数据标准化。
1 2 3 4 5 6 7 8 9 10 11 |
# 对 Iris 数据集的数据属性进行标准化。 from sklearn.datasets import load_iris from sklearn import preprocessing # 加载 Iris 数据集 iris = load_iris() print(iris.data.shape) # 分离数据和目标属性 X = iris.data y = iris.target # 对数据属性进行标准化 standardized_X = preprocessing.scale(X) |
有关更多信息,请参阅 API 文档中的 scale 函数。
提示:选择哪种方法
在应用算法之前,很难知道重新缩放数据是否会提高算法的性能。它通常可以,但并非总是如此。
一个好建议是创建数据集的重新缩放副本,并使用您的测试工具和少量您想要快速检查的算法来对它们进行测试。这可以快速突出在给定模型下重新缩放数据的优势(或缺乏优势),以及哪种重新缩放方法可能值得进一步研究。
总结
数据重新缩放是应用机器学习算法之前数据准备的一个重要部分。
在本教程中,您了解了数据重新缩放在应用机器学习过程中的位置,以及两种方法:归一化和标准化,您可以在 Python 中使用 scikit-learn 库来重新缩放数据。
更新:请参阅此帖子以获取更现代的示例集。
您好,感谢这篇精彩的文章!我有一个快速问题(可能要花很长时间解释,但我认为答案很短 🙂 )
我正在为 k-NN 算法使用数据标准化。我将有新的实例,并且需要确定它们的类别,它们的数据将不会被标准化。
我应该
1) 使用 scale 函数标准化我的训练集。然后手动计算我训练集的均值和标准差,以标准化我的新向量。
2) 将新数据添加到训练集中,然后使用 mean 函数对该集进行标准化。
3) 以上都不是
谢谢!
Matt,好问题。
一般来说,最好使用训练数据计算重新缩放参数,并使用这些参数来重新缩放测试数据集以及所有需要预测的数据集。
您可以使用 StandardScaler() 对象,它具有均值和标准差。
有关更现代的示例,请参阅此帖子
https://machinelearning.org.cn/prepare-data-machine-learning-python-scikit-learn/
我偶然发现了您的网站,这对学习机器学习非常有帮助。感谢您的辛勤工作。
只是一个友好的提醒。归一化函数有一个 axis 参数,其默认值为 1,因此它默认在行/数据上运行。对于特征归一化,您需要将 axis 设置为 0。
谢谢 Tzu-Yen!
嘿 Tzu-Yen,你拯救了我的一天……非常感谢
嗨,Jason,
我能知道如何将数据恢复到原始比例吗?我需要我的预测值回到原始比例。我归一化了我的数据并尝试了 .inverse_transform(data) 来恢复我的原始数据。但它给了我一个错误 - AttributeError: ‘Normalizer’ object has no attribute ‘inverse_transform’
任何帮助都将不胜感激。
我建议使用 MinMaxScaler
https://scikit-learn.cn/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
嗨,Jason,
我有一个问题。
假设今天我的数据范围是 5000 到 10000,将被缩放到 0 到 1 之间
明天,如果出现一个新数据录入,其值为 10500。如果我使用相同的 5000 到 10000 范围进行拟合,它会产生输出 X1;如果我指定 5000 到 10500 的范围,它会产生输出 X2,而 X2 不等于 X1。
如何克服这个问题?如何处理带有旧范围的新数据?
谢谢及问候
Sumit
您可以估计未来数据的预期范围,并使用这些最小值/最大值进行缩放。
或者,如果数据是高斯分布的,您可以估计均值/标准差进行标准化。
Jason,当我使用帖子中建议的标准化时,我看到均值和标准差分别非常接近零和一……但不是完全相同。想知道社区是否可以接受这样接近的值?
计数 7.68E+02
均值 -6.48E-17
标准差 1.00E+00
最小值 -1.14E+00
25% -8.45E-01
50% -2.51E-01
75% 6.40E-01
最大值 3.91E+00
也许可以。
您好,请问 preprocessing.scale() 背后的公式是什么?
当然,在这里了解更多
https://scikit-learn.cn/stable/modules/generated/sklearn.preprocessing.scale.html
还有这里
https://en.wikipedia.org/wiki/Standard_score
在训练数据集时,我的准确率约为 100%。但测试时,我没有得到正确答案。可能是什么原因?您能帮帮我吗?
听起来您在过度拟合训练数据集。
嗨 Jason Brownlee 先生,我想问一下如何使用 normalizer 将值打印回它们的原始比例?
您可以反转缩放转换,调用 scaler.invert_transform()
嗨,Jason,
我尝试使用 standardized_X = preprocessing.scale(X)。
我通过 print(np.mean(standardized_X[:,0])) 进行了检查,但均值不是零(对于四个列中的任何一个),尽管标准差为一。我是否做错了什么。
Please suggest.
我很惊讶。我期望它是零,也许确认您没有引入错误或拼写错误?
如果我使用深度神经网络进行回归预测时,目标值在不同范围内,通过对目标值进行归一化来获得更高的准确性是否有帮助?如果有,我应该使用哪种技术?
是的,也许可以尝试归一化和标准化,看看哪种比不缩放能获得更好的技能。
何时归一化,何时标准化??
当数据变量具有不同单位时,进行归一化。
当变量呈高斯分布时,进行标准化。
我有一个愚蠢的问题;
您的代码中有两行。
X = iris.data
y = iris.target
X 和 Y 如何知道什么是因变量和自变量?它会在我的数据集上起作用,而无需我告诉它(我怀疑)吗?
谢谢
我根据我对问题的了解来选择因变量/自变量。
也许这篇帖子可以帮助您解决问题
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
嗨,Jason,
首先,我想说我非常欣赏您的博客文章,它们对我帮助很大!
我在重现文章中的归一化/标准化时遇到问题。作者写道“(……)幅度按对数缩放。每个频率带的特征都归一化为零均值和单位方差。” - 他们是指标准化,那么使用 preprocessing.scale 就足够了吗?
为了使其更具混淆性,我发现另一组人正在重现第一组的结果。他们写道“对每个窗口计算归一化总幅度的对数。
在输入网络之前,将滤波器组能量归一化到 0 到 1 之间的范围。”对我来说,这看起来像普通的归一化。
这是描述的相同过程吗?我怀疑……
非常感谢您的帮助!
Hannah
也许直接联系作者,询问他们具体做了什么?
除非学者发布用于生成结果的代码,否则他们的论文充其量是浪费时间,最坏的情况是欺诈。
嗨,Jason,
关于标准化,有一个快速问题,假设我在整个总体中选择了一个样本数据来构建模型,并在运行模型之前标准化了值。那么,我是否可以直接将这些 beta 系数应用于整个总体,或者由于我通过标准化值找到了 beta 系数,我是否应该标准化整个总体中的所有值?
我建议从训练集中估计系数,并将在今后所有数据上使用它们。
嘿,谢谢回复,你能详细说明一下为什么应该使用从训练集中估计的系数并将它们用于所有数据吗?
如果我们从所有数据中估计分布,然后评估模型在其中一部分数据上的性能,我们将受到数据泄露的影响,结果将是乐观的——我们使用了测试范围之外的知识。
更多信息在这里
https://machinelearning.org.cn/data-leakage-machine-learning/
我正在尝试使用 Pytorch 对 household_power_consumption_days.csv 数据进行编码 LSTM。那么,我应该归一化还是重新缩放数据?
抱歉,我没有 Pytorch 的示例。
在建模之前缩放数据是一个好习惯。
你好 Jason,
为了训练 SVM 分类器,数据应该缩放到 [0,1] 还是 [-1, 1]?
提前感谢
我认为目标需要是 {-1, 1}。但 sklearn 会为你处理——据我所知。
谢谢 Jason,
如果我只有 1 个特征,是否需要归一化/缩放?
我的数据只有 x 和 y,其中 y 是因变量。我正在处理随机森林回归。
或许可以试试看?
如何在 sklearn 中将具有文本值的数据集正确地归一化为数字?我的数据集有训练和测试部分,并且在归一化后我得到了不同数量的列。如何对它们进行等量归一化?
也许尝试词袋模型
https://machinelearning.org.cn/gentle-introduction-bag-words-model/
决策树算法是否需要归一化?
通常不需要。
非常感谢您撰写这篇教程。何时使用归一化,何时使用标准化?我阅读了一篇文章,他们说“如果我们想重新缩放数据集中的每个观测值,我们可以使用归一化。如果我们想按数据集中的特征进行重新缩放,我们可以使用标准化。”
很高兴它有帮助。
通常进行归一化,当变量是高斯分布时使用标准化。
如果您不确定,请测试两者,并使用结果技能最好的那个。
您好 Jason,感谢所有信息,我们看看您能否帮我。
我完成了对预测变量的缩放,并且在进行预测时,结果以科学计数法出现。我研究了一下,发现有一种方法可以进行 inverse_transform,逆转缩放过程,我尝试了,但未能成功逆转,您能帮帮我吗?
下面是测试代码。
import pandas as pd
import numpy as np
base = pd.read_csv(‘c://udemy//ia//bd//house-prices.csv’)
X = base.iloc[:, 3:19].values
y = base.iloc[:, 2].values
from sklearn.model_selection import train_test_split
X_treinamento, X_teste, y_treinamento, y_teste = train_test_split(X, y,
test_size = 0.3,
random_state = 0)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_treinamento = scaler.fit_transform(X_treinamento)
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=4)
X_treinamento_poly = poly.fit_transform(X_treinamento)
X_teste_poly = poly.transform(X_teste)
regressor = LinearRegression()
regressor.fit(X_treinamento_poly, y_treinamento)
score = regressor.score(X_treinamento_poly, y_treinamento)
previsoes = regressor.predict(X_teste_poly)
previsoes = scaler.inverse_transform(previsoes) = 无法正常工作。
是的,这里有一些您可以作为起点使用的示例
https://machinelearning.org.cn/machine-learning-data-transforms-for-time-series-forecasting/
你好 Jason,
感谢您的提示,根据您所说的,我看到了可以inverse_transform,但是在应用时出现了一个错误,这个错误似乎很简单,很容易解决,但就是解决不了,出现了这个错误
ValueError: operands could not be broadcast together with shapes (6484,) (16,) (6484,)
我尝试对predictions变量应用reshape,但完全不起作用。
有什么建议吗?
调用transform()和inverse_transform()时,数据的形状和列的顺序必须相同。
也许可以检查一下。
明白了,现在可以了,谢谢!
import pandas as pd
base = pd.read_csv(‘c://udemy//ia//bd//house-prices.csv’)
X = base.iloc[:, 3:19].values
y = base.iloc[:, 2:3].values
from sklearn.preprocessing import StandardScaler
scaler_x = StandardScaler()
X = scaler_x.fit_transform(X)
scaler_y = StandardScaler()
y = scaler_y.fit_transform(y)
from sklearn.model_selection import train_test_split
X_treinamento, X_teste, y_treinamento, y_teste = train_test_split(X, y,
test_size = 0.3,
random_state = 0)
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=4)
X_treinamento_poly = poly.fit_transform(X_treinamento)
X_teste_poly = poly.transform(X_teste)
regressor = LinearRegression()
regressor.fit(X_treinamento_poly, y_treinamento)
score = regressor.score(X_treinamento_poly, y_treinamento)
# previsóes com o scalonamento reverso
previsoes1 = scaler_y.inverse_transform(regressor.predict(X_teste_poly))
y_teste = scaler_y.inverse_transform(y_teste)
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_teste, previsoes1)
#Testando com o y_teste e previsóes ainda com scalonamento
previsoes = regressor.predict(X_teste_poly)
scaler_teste = StandardScaler()
y_teste = scaler_teste.fit_transform(y_teste)
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_teste, previsoes)
很高兴听到这个消息。
先生,如何在Python中获取给定数据集的均值=0和标准差=1?
使用StandardScaler
https://scikit-learn.cn/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
Jason,文章写得很好。我从您文章的几个点中学到了东西,并将其付诸实践,实现了一个ML模型来比较其影响。这是文章:https://medium.com/@vibhaas.kotwal/feature-scaling-8c92bdd080a1
请让我知道您的意见。
谢谢。
抱歉,我没有能力审查您的作品。
先生,
我得到intercept_ =3.1378, 93 support_vectors_ 和 93 dual_coef_,然后,
如何在Python中获得多项式SVM的超平面方程?
谢谢你。
我相信您可以从sklearn API检索所有系数。
亲爱的 Jason,
我有一个csv数据集需要归一化。但是,我只想归一化除目标变量以外的所有列,如何实现?
import pandas as pd
from sklearn import preprocessing
data=pd.read_csv(‘File.csv’)
min_max_scaler = preprocessing.MinMaxScaler()
np_scaled = min_max_scaler.fit_transform(data)
df_normalized = pd.DataFrame(np_scaled)
df_normalized = df_normalized.to_csv(Norm_File.csv’,header=True, index=False)
非常感谢。
我不确定您是否可以直接在数据帧上使用scaler,也许可以先从它们中提取numpy数组?
你好
您对本教程有任何疑问吗?
你好
我有一个数据集
包含3列
receney frequency monetary
那么我可以对日期进行预处理,标准化或归一化吗?(我将数据集用于Kmeans)
请帮帮我。抱歉,我的英语不好
非常感谢您
通常,日期会从数据中删除。
也许这能帮助您进行聚类
https://machinelearning.org.cn/clustering-algorithms-with-python/
非常感谢您。您的文章真的帮了我很多。祝您有美好的一天
不客气,很高兴听到!
我才刚开始学习
我写了它
请问您能帮我检查一下我的代码是对还是错吗?
我做了预处理
***********
from sklearn.cluster import KMeans
import pandas as pd
import matplotlib.pyplot as plt
sse = {}
#load our data from CSV
tx_user = pd.read_csv(‘rfm_data.csv’, sep =’,’ , engine=’python’)
# display(tx_user[[‘M’]].boxplot())
#PRE-PROCESSING ———————————————–
col_names = [‘R’,’F’, ‘M’]
#Step 1: Rescale Data
#from sklearn.preprocessing import MinMaxScaler
#min_max_scaler = MinMaxScaler()
#tx_user[col_names] = min_max_scaler.fit_transform(tx_user[col_names])
#Step 2: Standardize Data
from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler()
tx_user[col_names]=pd.read_csv(‘rfm_data.csv’, sep =’,’ , engine=’python’)
tx_user[col_names] = standard_scaler.fit_transform(tx_user[col_names])
#Step 3: Normalize Data
#from sklearn.preprocessing import Normalizer
#normalizer = Normalizer()
#tx_user[col_names] = normalizer.fit_transform(tx_user[col_names])
#print(‘Descriptive statistic of preprocessed data: ‘)
#display(tx_user.describe())
#END OF PRE-PROCESSING ——————————————-
for k in range(1, 10)
kmeans = KMeans(n_clusters=k, max_iter=1000).fit(tx_user[[‘R’,’F’, ‘M’]])
tx_user[“clusters”] = kmeans.labels_
sse[k] = kmeans.inertia_
print(‘\n \n Sum of squared distances of samples to their closest cluster center: \n’)
df_sse = pd.DataFrame(sse.items(), columns = [‘K Cluster’,’Sum of Squared Errors’])
display(df_sse)
keys = list(sse.keys())
values = list(sse.values())
plt.figure()
plt.plot(keys, values)
plt.xlabel(“Number of cluster – Kmean on dataraw _ group by”)
# Add title and axis names
plt.title(‘Within-Cluster-Sum of Squared Errors (WSS) for different values of k’)
plt.xlabel(‘K cluster’)
plt.ylabel(‘Sum of Squared Errors (WSS)’)
plt.show()
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code
我想对客户进行聚类。我使用了两种方法来处理同一个数据集。一种方法是我使用经济学中的RFM模型手动编码。另一种方法是使用Kmeans算法进行聚类。现在我想比较哪种方法更好。但我遇到了麻烦。我还没有弄清楚哪种方法会给出更好的结果。
选择一个指标,设计一个测试框架,然后在测试框架中应用两种方法,看看哪种方法在您的指标上表现更好。
非常感谢您
不客气。
嗨
在对“客户细分”客户进行聚类后,我想将这些聚类可视化。我该怎么办?
也许可以试试成对散点图?
是的,是的,是的。我想要成对散点图
我写了代码,但出现了“AttributeError:‘KMeans’ object has no attribute ‘labels’”
但还是没能修复。
# 模块
import matplotlib.pyplot as plt
from matplotlib.image import imread
import pandas as pd
import seaborn as sns
from sklearn.datasets.samples_generator import (make_blobs,
make_circles,
make_moons)
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_samples, silhouette_score
%matplotlib inline
sns.set_context(‘notebook’)
plt.style.use(‘fivethirtyeight’)
from warnings import filterwarnings
filterwarnings(‘ignore’)
# Import the data
df = pd.read_csv(‘Visualization_1.csv’)
# Plot the data
plt.figure(figsize=(6, 6))
plt.scatter(df.iloc[:, 0], df.iloc[:, 1])
plt.xlabel(‘Eruption time in mins’)
plt.ylabel(‘Waiting time to next eruption’)
plt.title(‘Visualization of raw data’);
# Standardize the data
X_std = StandardScaler().fit_transform(df)
# Run local implementation of kmeans
def cluster(n_clusters)
km = Kmeans(n_clusters=2, max_iter=100)
km.fit(X_std)
centroids = km.centroids
# Plot the clustered data
fig, ax = plt.subplots(figsize=(6, 6))
plt.scatter(X_std[km.labels == 0, 0], X_std[km.labels == 0, 1],
c=’green’, label=’cluster 1′)
plt.scatter(X_std[km.labels == 1, 0], X_std[km.labels == 1, 1],
c=’blue’, label=’cluster 2′)
plt.scatter(centroids[:, 0], centroids[:, 1], marker=’*’, s=300,
c=’r’, label=’centroid’)
plt.legend()
plt.xlim([-2, 2])
plt.ylim([-2, 2])
plt.xlabel(‘Eruption time in mins’)
plt.ylabel(‘Waiting time to next eruption’)
plt.title(‘Visualization of clustered data’, fontweight=’bold’)
ax.set_aspect(‘equal’);
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code
非常感谢,非常感谢。
不客气。
你好,我刚开始接触这些,但我的任务我不知道如何做
使用pandas进行数据归一化
a. 从数据集中减去每个特征的平均值。
b. 减去均值后,另外将特征值除以其
各自的“标准差”。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
#step 1
col_names = [“Size”,”Bedrooms”,”Price”]#name cols
#importing data
df2 = pd.read_csv(“dataset2.txt”, header = None,skiprows=0, names= col_names)
#print first 5 elements of Dataframe
print(df2.head())
print(df2.describe())#show some stats
我不知道如何减去均值和标准差,请问你能告诉我怎么做吗?
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code
Jason,您好,感谢您的文章。
您是否建议对输入特征使用Sigmoid函数转换以使异常值更接近其他值的集合,因为异常值是极端值而不是错误?即 -1+2/(1+e^-ax);这将替换异常值并标准化数据。
不完全是。也许可以尝试一下,看看它是否适合您的数据/模型/项目。
嗨,Jason,
您是否有关于如何归一化/缩放多元时间序列数据的教程?
感谢您所有宝贵的指南,
您可以分别缩放每个系列。
这可以作为起点
https://machinelearning.org.cn/machine-learning-data-transforms-for-time-series-forecasting/
你好,
请告诉我preprocessing.normalize()背后的公式
好的,请看这里:
https://machinelearning.org.cn/vector-norms-machine-learning/
我不明白的是如何对预测数据集进行反向缩放,因为它与训练特征数据集具有不同的维度?
使用scaler对象并调用inverse_transform()函数,然后传入预测值。
目标变量的scaler接受一个列用于y或yhat – 相同的维度。
大家好,
您能否帮助我理解以下存储库中均值文件的计算方法?
我得到了不同的值,对于同一个数据集。
https://github.com/Veleslavia/EUSIPCO2017/tree/master/means
我建议直接联系作者。
嗨,Jason,
非常感谢您的帖子,我觉得非常有帮助。
我想问一下关于scaler的使用。例如,我正在做一个回归问题,我的输入X(10列,10万行)和目标y(1列,10万行)作为我的训练数据集。我使用了两个StandardScaler X_scaler和y_scaler分别对X和y进行缩放。由于我使用了缩放后的X和y进行模型拟合,我预计预测结果y_hat也会被缩放。对于训练,我可以很容易地将我的预测反向缩放到原始尺度,因为我有y_scaler。然而,对于实际预测,我只有新的数据集X’。如果我对X’进行缩放并将其输入我的模型,我预计会得到一个缩放后的预测。但是,我如何将我的预测反向缩放到原始尺度,因为它的维度可能与训练y不同?
您能否帮助我解决这个问题?非常感谢!
不客气。
是的,您必须以与训练数据相同的方式缩放所有新数据。例如,输入数据。您也可以缩放训练数据中的目标,模型将学会预测缩放后的目标。然后,您可以对预测进行反向转换,以获得原始尺度。
您必须确保您的训练数据集充分代表了数据,以便模型能够学习问题,并且转换能够捕捉数据的尺度。如果这很困难,您可以手动管理数据的缩放/转换(例如,在新的数据中将超出范围的值剪辑)。
这有帮助吗?
Jason博士,您好,在这里的数据归一化示例中,
用于归一化数据属性
normalized_X = preprocessing.normalize(X)
请问normalize函数使用的归一化(重缩放)函数或规则是什么?我能知道这项技术的详细信息吗?
非常感谢
如果归一化比不使用它能带来更好的模型性能,就使用归一化。这是最好的规则。
我有一个数据集,我需要对其进行归一化,因为数据尺度不同。现在,有没有办法恢复到原始数据,也就是类似反归一化,回到具有不同尺度的数据?
是的,您可以使用scaler对象直接进行反向转换,例如 scaler.inverse_transform()
各位好,我和我兄弟都很喜欢您的书,以及您在书中简化了很多东西。
所以我的问题是关于数据集的归一化。我有一个大型数据集,其中有一个金额列,其值从-574617714.32到600000000.0,还有大约1000万笔交易(这只是一个样本)。
我归一化了金额,并对其他一些特征使用了类别编码器。但当我想要预测新数据(未归一化或编码)的结果时,我的问题就出现了。对于编码数据,我使用了一个字典来存储编码值,然后用字典中的相应值来替换要预测的新数据中的值。
如果我用sklearn归一化金额,它只会对新数据进行归一化,而不会考虑之前的minmax。如果我添加两行来表示min和max,结果仍然不同。
我尝试使用“MaxAbsScaler().fit(dataset[[‘AMOUNT’]]).max_abs_”来检索拟合参数并将其存储在json或csv中,然后使用它来转换新数据的金额列,但仍然不起作用。
我的问题是,如何存储用于训练数据归一化的参数,以便我可以使用它们来转换要预测的新数据?
或者我只需要像您在一本书中展示的那样使用这个
“dataset[‘AMOUNT’].apply(lambda x: (x – minmax[0]) / (minmax[1] – minmax[0]))”
然后我定义min和max。我对此并不完全有信心,因为归一化金额的变化相当微不足道,与MaxAbsScaler相比。
另一个问题是,由于列包含金额,其内容从负数到正数不等,哪种归一化或标准化最适合获得最佳结果?
谢谢。
谢谢!
如果您愿意,可以保存scaler对象。
https://machinelearning.org.cn/how-to-save-and-load-models-and-data-preparation-in-scikit-learn-for-later-use/
“最佳”scaler取决于您的模型和数据。也许可以从归一化开始,并与其他方法比较结果,看看它们是否能带来更好的性能。
谢谢,我会尝试一下。
不客气。
你好,非常棒的文章。
我需要一些关于缩放的指导。
我正在训练神经网络。我用了这样的缩放方式
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(x_train)
X_train = scaler.transform(x_train)
X_test=scaler.transform(Xv)
scalerY = preprocessing.StandardScaler().fit(y_train.values.reshape(-1, 1))
Y_train = scalerY.transform(y_train.values.reshape(-1, 1))
Y_test=scalerY.transform(yv.values.reshape(-1, 1))
但是我对这种技术是对还是错感到困惑。这种缩放方式为我提供了更好的结果,但当我使用StandardScaler缩放数据时,结果却非常糟糕。您能否在这方面指导我?谢谢
通常,您必须在训练集上拟合scaler对象,然后将其应用于训练集和测试集,以避免数据泄露。
这可能有帮助
https://machinelearning.org.cn/data-preparation-without-data-leakage/