使用scikit-learn生成困难分类数据集



我试图在scikit-learn中使用make_classification生成一系列合成数据集,这些数据集具有不同的样本量、患病率(即正类的比例)和准确性。改变样本大小和流行程度是相当简单的,但我很难使用逻辑回归生成任何准确性低于50%的数据集。摆弄信息列的数量、每个类的簇的数量和flip_y参数(随机翻转给定观察比例的类)似乎会降低准确性,但没有我想的那么多。是否有一种方法可以改变make_classification的参数,从而进一步减少这种情况(例如,减少到20%)?

谢谢!

一般来说,少量的n_samples,高概率的随机翻转标签flip_y和大量的n_classes的组合应该会得到你想要的。

您可以尝试以下操作:

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。例如,如果您选择flip_y为高,这意味着您几乎翻转了每个标签,从而使问题更容易!(保持一致性)

因此,在二进制分类中,flip_y实际上是min(flip_y,1-flip_y),将其设置为0.5会使分类变得非常困难。

您可以做的另一件事是:创建数据后,使用PCA进行降维:

from sklearn.cross_validation import cross_val_score
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
X, y = make_classification(n_samples=10000, n_informative=18,n_features=20, flip_y=0.15, random_state=217)
print cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=4)
#prints [ 0.80287885  0.7904      0.796       0.78751501]
pca = PCA(n_components=10)
X = pca.fit_transform(X)
print cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=4)
#prints [ 0.76409436  0.7684      0.7628      0.75830332]

您可以减少n_components以获得更差的结果,同时保留原始数量的特征:

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%的准确率非常低

相关内容

  • 没有找到相关文章

最新更新