特征离散化是一种数据预处理技术,它将每个特征分解成一系列等宽的区间(bins)。这些离散值随后被独热编码,并提供给线性分类器。这种预处理方法使得即使分类器本身是线性的,也能表现出非线性的行为。在本例中,前两个数据集(月亮形状和同心圆)在线性上是不可达的,而第三个数据集则近似于线性可分。在这两个线性不可分的数据集上,特征离散化显著提高了线性分类器的性能。相反,在线性可分的数据集上,特征离散化降低了线性分类器的性能。此外,还展示了两个非线性分类器以供比较。
需要注意的是,本例的直观感受并不一定适用于真实数据集。特别是在高维空间中,数据更容易被线性分隔。此外,使用特征离散化和独热编码会增加特征的数量,当样本数量较少时,容易导致过拟合。图表显示了训练点以实色表示,测试点以半透明表示。右下角显示了测试集上的分类准确率。
以下是三个不同数据集的分类器性能对比:
对于第一个数据集,可以看到:
LogisticRegression: 0.86
LinearSVC: 0.86
KBinsDiscretizer + LogisticRegression: 0.86
KBinsDiscretizer + LinearSVC: 0.94
GradientBoostingClassifier: 0.90
SVC: 0.94
对于第二个数据集,分类器的性能如下:
LogisticRegression: 0.40
LinearSVC: 0.40
KBinsDiscretizer + LogisticRegression: 0.78
KBinsDiscretizer + LinearSVC: 0.80
GradientBoostingClassifier: 0.84
SVC: 0.84
在第三个数据集上,分类器的性能表现如下:
LogisticRegression: 0.98
LinearSVC: 0.96
KBinsDiscretizer + LogisticRegression: 0.94
KBinsDiscretizer + LinearSVC: 0.94
GradientBoostingClassifier: 0.94
SVC: 0.98
:scikit-learn开发者 SPDX许可证标识符:BSD-3-Clause
以下是用于生成这些结果的Python代码示例:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_circles, make_classification, make_moons
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.exceptions import ConvergenceWarning
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import KBinsDiscretizer, StandardScaler
from sklearn.svm import SVC, LinearSVC
from sklearn.utils._testing import ignore_warnings
# 更多代码...
请注意,上述代码仅展示了部分内容,完整的代码可以在相关的Jupyter笔记本或Python源代码文件中找到。
总的脚本运行时间:(0分钟 3.620秒)
下载Jupyter笔记本:
下载Python源代码:
下载压缩包: