如何使用sklearn.datasets.make_classification生成线性可分离数据集?

Blu*_*ino 5 python dataset scikit-learn

我用来sklearn.datasets.make_classification生成一个应该是线性可分离的测试数据集。问题在于并非每个生成的数据集都是线性可分的。如何使用 生成线性可分离数据集sklearn.datasets.make_classification?我的代码如下:

samples = make_classification(
    n_samples=100, n_features=2, n_redundant=0,
    n_informative=1, n_clusters_per_class=1, flip_y=-1
)
Run Code Online (Sandbox Code Playgroud)

vog*_*gdb 6

我相信这个问题已经得到解答,但还有另一个有趣的选择datasets.make_blobs。请看代码:

import matplotlib.pyplot as plt
from sklearn import datasets

X, y = datasets.make_blobs(n_samples=100, centers=2, n_features=2, center_box=(0, 10))
plt.plot(X[:, 0][y == 0], X[:, 1][y == 0], 'g^')
plt.plot(X[:, 0][y == 1], X[:, 1][y == 1], 'bs')
plt.show()
Run Code Online (Sandbox Code Playgroud)


小智 5

没有“线性可分离”选项,但当数据集不可线性分离时,您可以拒绝该数据集,并生成另一个数据集。像这样:

separable = False
while not separable:
    samples = make_classification(n_samples=100, n_features=2, n_redundant=0, n_informative=1, n_clusters_per_class=1, flip_y=-1)
    red = samples[0][samples[1] == 0]
    blue = samples[0][samples[1] == 1]
    separable = any([red[:, k].max() < blue[:, k].min() or red[:, k].min() > blue[:, k].max() for k in range(2)])
plt.plot(red[:, 0], red[:, 1], 'r.')
plt.plot(blue[:, 0], blue[:, 1], 'b.')
plt.show()
Run Code Online (Sandbox Code Playgroud)

套

这仅测试垂直或水平分离,但无论如何,这些都是您期望在您的设置中发生的情况。

此外,class_sep争论越多,分离的可能性就越大。