Scikit learn 使用scikit学习生成困难的分类数据集

Scikit learn 使用scikit学习生成困难的分类数据集,scikit-learn,Scikit Learn,我正在尝试使用scikit learn中的make_分类生成一系列合成数据集,具有不同的样本大小、普遍性(即阳性类别的比例)和准确性。改变样本大小和患病率是相当简单的,但我很难使用逻辑回归生成任何精度低于50%的数据集。玩弄信息列的数量、每个类的集群数量和flip_y参数(随机翻转给定比例观察值的类)似乎会降低准确性,但并不像我希望的那样多。是否有办法改变make_分类的参数,使其进一步降低(例如,降低到20%) 谢谢 一般来说,数量相当少的n_样本、随机翻转标签的概率很高的flip_y和大量的

我正在尝试使用scikit learn中的make_分类生成一系列合成数据集,具有不同的样本大小、普遍性(即阳性类别的比例)和准确性。改变样本大小和患病率是相当简单的,但我很难使用逻辑回归生成任何精度低于50%的数据集。玩弄信息列的数量、每个类的集群数量和flip_y参数(随机翻转给定比例观察值的类)似乎会降低准确性,但并不像我希望的那样多。是否有办法改变make_分类的参数,使其进一步降低(例如,降低到20%)


谢谢

一般来说,数量相当少的
n_样本
、随机翻转标签的概率很高的
flip_y
和大量的
n_类
的组合应该可以让你达到你想要的目的

您可以尝试以下操作:

from sklearn.cross_validation import cross_val_score
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

# 2-class problem
X, y = make_classification(n_samples=100, n_informative=2, flip_y=0.8, random_state=42)

cross_val_score(estimator=lr, X=X, y=y, scoring='accuracy', cv=10)

# Output
array([ 0.54545455,  0.27272727,  0.45454545,  0.2       ,  0.4       ,
        0.5       ,  0.7       ,  0.55555556,  0.55555556,  0.44444444])

# 8-class problem
X, y = make_classification(n_samples=100, n_classes=8, n_informative=4, n_clusters_per_class=1, flip_y=0.5, random_state=42)

cross_val_score(estimator=lr, X=X, y=y, scoring='accuracy', cv=5)

# Output
array([ 0.16666667,  0.19047619,  0.15      ,  0.16666667,  0.29411765])

如果只使用二进制分类,则应仔细选择
flip\y
。例如,如果您选择“翻转y”设置为“高”,这意味着您几乎翻转了所有标签,从而使问题更容易解决!。(保持一致性)

因此,在二进制分类中,
flip\u y
实际上是
min(flip\u y,1-flip\u y)
,将其设置为0.5将使分类非常困难

您可以做的另一件事:创建数据后,使用以下方法进行维度缩减:

您可以减少
n_组件
,以获得更差的结果,同时保留原始数量的功能:

pca = PCA(n_components=1)
X = pca.fit_transform(X)

X = np.concatenate((X, np.random.rand(X.shape[0],19)),axis=1) #concatenating random features
cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=10)
print cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=4)
#prints [ 0.5572  0.566   0.5552  0.5664]
获得低于50%的准确度是“困难的”——即使采用随机向量,准确度的期望值仍然是0.5:

X = np.random.rand(10000,20)
print np.average(cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=100))
#prints 0.501489999

因此,55%的准确率被认为是非常低的。

了解您在这里实际如何计算准确率可能很重要。这里,准确率是二元分类准确率,即,(TP+TN)/n谢谢,这很有帮助!我实际上需要继续讨论二进制分类问题,但我将尝试使用较小的样本。我以前玩过1000-20000个样品。@Sean B.这就是你的意思吗?是的,谢谢!PCA是一个好主意,是的,大约50%似乎是我能得到的最低水平(我在一个100个样本的情况下能够达到42%)。即使我迟到了,这里有一个方法可以使用make_分类生成不同难度的数据。
X = np.random.rand(10000,20)
print np.average(cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=100))
#prints 0.501489999