通过管道后使用归一化的 X, y
Using normalized X, y after passing through pipeline
我正在使用 scikit-learn Pipeline
创建 SVM。创建模型后,我想使用 scikit 函数,如 confusion_matrix
、plot_confusion_matrix
和 permutation_importance
,过去使用这些函数时,我总是通过规范化X 值,但在使用管道时,这些值会在模型启动时被归一化。管道是否也在 plot_confusion_matrix
等内部规范化这些内容?
这是包含我的 Pipeline
的代码,尽管它没有什么特别之处。 num_cols
是数据框中具有数字特征的列,cat_cols
是分类特征。
num_trans = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
cat_trans = OneHotEncoder(handle_unknown='ignore')
#num_cols are numeric features and cat_cols are categorical
preprocess = ColumnTransformer(transformers=[
('num', num_trans, num_cols),
('cat', cat_trans, cat_cols)])
X = mdf[feats]
y = mdf[tgt].values
model = Pipeline(steps=[('preprocessor', preprocess),
('classifier', SVC(C=1, gamma=0.1))])
model.fit(X, y)
pred = model.predict(X)[-1]
cm = confusion_matrix(y, model.predict(X))
plot_confusion_matrix(model, X, y)
如果我理解得很好,你是在问混淆矩阵中的值是否也被归一化了,对吧?
当你拟合模型变量时,它是一个 Pipeline 对象,你实际上是在调用预处理和拟合 SVC classifier.
的步骤。
plot_confusion_matrix 实际做的是采用您的模型,进行预测,将目标的真实值(存储在 y 中)与预测值进行比较并生成混淆矩阵图。
confusion_matrix 和 plot_confusion_matrix 在调用时 不会启动 fit 方法流水线 class,但仅使用 class 中的 model.predict() 方法获得预测。由于这个原因,混淆矩阵中的结果没有被归一化,因为函数没有调用底层 Sklearn 库中的任何拟合方法(Here 你可以在 Sklearn 库中查看 plot_confusion_matrix 的源代码) .他们 objective 的混淆矩阵正在获取目标的预测值和真实值之间的比较。
注意.
查看文档,plot_confusion_matrix is deprecated in 1.0 and will be removed in 1. 我建议你使用 ConfusionMatrixDisplay
@Andrea 是对的。
我要补充一点,如果您想将 normalized/scaled 数据传递给绘图函数,则必须使用流水线中学习的参数对其进行转换。如下所示:
#...
model = Pipeline(steps=[('preprocessor', preprocess),
('classifier', SVC(C=1, gamma=0.1))])
model.fit(X, y)
preprocessor = model.best_estimator_.steps['preprocessor']
X_preprocessed = preprocessor.transform()
plot_confusion_matrix(model, X_preprocessed, y)
我正在使用 scikit-learn Pipeline
创建 SVM。创建模型后,我想使用 scikit 函数,如 confusion_matrix
、plot_confusion_matrix
和 permutation_importance
,过去使用这些函数时,我总是通过规范化X 值,但在使用管道时,这些值会在模型启动时被归一化。管道是否也在 plot_confusion_matrix
等内部规范化这些内容?
这是包含我的 Pipeline
的代码,尽管它没有什么特别之处。 num_cols
是数据框中具有数字特征的列,cat_cols
是分类特征。
num_trans = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
cat_trans = OneHotEncoder(handle_unknown='ignore')
#num_cols are numeric features and cat_cols are categorical
preprocess = ColumnTransformer(transformers=[
('num', num_trans, num_cols),
('cat', cat_trans, cat_cols)])
X = mdf[feats]
y = mdf[tgt].values
model = Pipeline(steps=[('preprocessor', preprocess),
('classifier', SVC(C=1, gamma=0.1))])
model.fit(X, y)
pred = model.predict(X)[-1]
cm = confusion_matrix(y, model.predict(X))
plot_confusion_matrix(model, X, y)
如果我理解得很好,你是在问混淆矩阵中的值是否也被归一化了,对吧? 当你拟合模型变量时,它是一个 Pipeline 对象,你实际上是在调用预处理和拟合 SVC classifier.
的步骤。plot_confusion_matrix 实际做的是采用您的模型,进行预测,将目标的真实值(存储在 y 中)与预测值进行比较并生成混淆矩阵图。 confusion_matrix 和 plot_confusion_matrix 在调用时 不会启动 fit 方法流水线 class,但仅使用 class 中的 model.predict() 方法获得预测。由于这个原因,混淆矩阵中的结果没有被归一化,因为函数没有调用底层 Sklearn 库中的任何拟合方法(Here 你可以在 Sklearn 库中查看 plot_confusion_matrix 的源代码) .他们 objective 的混淆矩阵正在获取目标的预测值和真实值之间的比较。
注意. 查看文档,plot_confusion_matrix is deprecated in 1.0 and will be removed in 1. 我建议你使用 ConfusionMatrixDisplay
@Andrea 是对的。
我要补充一点,如果您想将 normalized/scaled 数据传递给绘图函数,则必须使用流水线中学习的参数对其进行转换。如下所示:
#...
model = Pipeline(steps=[('preprocessor', preprocess),
('classifier', SVC(C=1, gamma=0.1))])
model.fit(X, y)
preprocessor = model.best_estimator_.steps['preprocessor']
X_preprocessed = preprocessor.transform()
plot_confusion_matrix(model, X_preprocessed, y)