如何使用 MinMaxScaler sklearn 规范化训练和测试数据
How to normalize the Train and Test data using MinMaxScaler sklearn
所以,我有这个疑问,一直在寻找答案。所以问题是当我使用时,
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1)
之后我将训练和测试模型(A
、B
作为特征,C
作为标签)并获得一些准确度分数。现在我的疑问是,当我必须预测新数据集的标签时会发生什么。说,
df = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
因为当我对列进行规范化时,A
和 B
的值将根据新数据而不是训练模型的数据进行更改。
所以,现在我的数据在如下数据准备步骤之后将是。
data[['A','B']] = min_max_scaler.fit_transform(data[['A','B']])
A
和 B
的值将相对于 df[['A','B']]
的 Max
和 Min
值发生变化。 df[['A','B']]
的数据准备是相对于 df[['A','B']]
的 Min Max
。
如何准备数据才能对不同的数字关联有效?我不明白这里的预测怎么会是正确的。
您应该使用 training
数据拟合 MinMaxScaler
,然后在预测之前对 testing
数据应用缩放器。
总结:
- 第 1 步:将
scaler
安装在 TRAINING data
上
- 第 2 步:使用
scaler
到 transform the TRAINING data
- 第 3 步:使用
transformed training data
到 fit the predictive model
- 第四步:使用
scaler
到transform the TEST data
- 第 5 步:
predict
使用 trained model
(第 3 步)和 transformed TEST data
(第 4 步)。
使用您的数据的示例:
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
#training data
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
#fit and transform the training data and use them for the model training
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1)
#fit the model
model.fit(df['A','B'])
#after the model training on the transformed training data define the testing data df_test
df_test = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
#before the prediction of the test data, ONLY APPLY the scaler on them
df_test[['A','B']] = min_max_scaler.transform(df_test[['A','B']])
#test the model
y_predicted_from_model = model.predict(df_test['A','B'])
使用虹膜数据的示例:
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
data = datasets.load_iris()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
model = SVC()
model.fit(X_train_scaled, y_train)
X_test_scaled = scaler.transform(X_test)
y_pred = model.predict(X_test_scaled)
希望对您有所帮助。
最好的方法是训练并保存 MinMaxScaler 模型,并在需要时加载它。
保存模型:
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
pickle.dump(min_max_scaler, open("scaler.pkl", 'wb'))
正在加载保存的模型:
scalerObj = pickle.load(open("scaler.pkl", 'rb'))
df_test = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
df_test[['A','B']] = scalerObj.transform(df_test[['A','B']])
所以,我有这个疑问,一直在寻找答案。所以问题是当我使用时,
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1)
之后我将训练和测试模型(A
、B
作为特征,C
作为标签)并获得一些准确度分数。现在我的疑问是,当我必须预测新数据集的标签时会发生什么。说,
df = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
因为当我对列进行规范化时,A
和 B
的值将根据新数据而不是训练模型的数据进行更改。
所以,现在我的数据在如下数据准备步骤之后将是。
data[['A','B']] = min_max_scaler.fit_transform(data[['A','B']])
A
和 B
的值将相对于 df[['A','B']]
的 Max
和 Min
值发生变化。 df[['A','B']]
的数据准备是相对于 df[['A','B']]
的 Min Max
。
如何准备数据才能对不同的数字关联有效?我不明白这里的预测怎么会是正确的。
您应该使用 training
数据拟合 MinMaxScaler
,然后在预测之前对 testing
数据应用缩放器。
总结:
- 第 1 步:将
scaler
安装在TRAINING data
上
- 第 2 步:使用
scaler
到transform the TRAINING data
- 第 3 步:使用
transformed training data
到fit the predictive model
- 第四步:使用
scaler
到transform the TEST data
- 第 5 步:
predict
使用trained model
(第 3 步)和transformed TEST data
(第 4 步)。
使用您的数据的示例:
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
#training data
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
#fit and transform the training data and use them for the model training
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
df['C'] = df['C'].apply(lambda x: 0 if x.strip()=='N' else 1)
#fit the model
model.fit(df['A','B'])
#after the model training on the transformed training data define the testing data df_test
df_test = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
#before the prediction of the test data, ONLY APPLY the scaler on them
df_test[['A','B']] = min_max_scaler.transform(df_test[['A','B']])
#test the model
y_predicted_from_model = model.predict(df_test['A','B'])
使用虹膜数据的示例:
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
data = datasets.load_iris()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
model = SVC()
model.fit(X_train_scaled, y_train)
X_test_scaled = scaler.transform(X_test)
y_pred = model.predict(X_test_scaled)
希望对您有所帮助。
最好的方法是训练并保存 MinMaxScaler 模型,并在需要时加载它。
保存模型:
df = pd.DataFrame({'A':[1,2,3,7,9,15,16,1,5,6,2,4,8,9],'B':[15,12,10,11,8,14,17,20,4,12,4,5,17,19],'C':['Y','Y','Y','Y','N','N','N','Y','N','Y','N','N','Y','Y']})
df[['A','B']] = min_max_scaler.fit_transform(df[['A','B']])
pickle.dump(min_max_scaler, open("scaler.pkl", 'wb'))
正在加载保存的模型:
scalerObj = pickle.load(open("scaler.pkl", 'rb'))
df_test = pd.DataFrame({'A':[25,67,24,76,23],'B':[2,54,22,75,19]})
df_test[['A','B']] = scalerObj.transform(df_test[['A','B']])