【问题标题】:How to preprocess this floating point data to use with scikit - Machine Learning如何预处理此浮点数据以与 scikit 一起使用 - 机器学习
【发布时间】:2016-02-11 19:27:10
【问题描述】:

我有包含 4000 个特征和 35 个样本的数据集。所有特征都是介于 1 和 3 之间的浮点数。例如:2.68244527684596。

我正在努力让任何分类器处理这些数据。我使用过 knn、svm(带有线性、rbf、poly)。然后我了解了标准化。不过,这对我来说有点复杂,我无法让这段代码正常工作并给我正确的预测。

我用来规范化数据的代码是:

train_data = preprocessing.scale(train_data)
train_data = preprocessing.normalize(train_data,'l1',0)

我试图分类的代码是:

# SVM with poly
svc1 = svm.SVC(kernel='poly',degree=3)
svc1.fit(train_data[:-5], train_labels[:-5])
print "Poly SVM: ",svc1.predict(train_data[-5:])

# SVM with rbf
svc2 = svm.SVC(kernel='rbf')
svc2.fit(train_data[:-5], train_labels[:-5])
print "RBF SVM: ",svc2.predict(train_data[-5:])

#SVM with linear
svc3 = svm.SVC(kernel='linear')
svc3.fit(train_data[:-5], train_labels[:-5])
print "Linear SVM: ",svc3.predict(train_data[-5:])


# KNN
knn = KNeighborsClassifier()
knn.fit(train_data[:-5], train_labels[:-5])
print "KNN :", knn.predict(train_data[-5:])

# Linear regression
logistic = linear_model.LogisticRegression()
print('LogisticRegression score: %f' % logistic.fit(train_data[5:], train_labels[5:]).score(train_data[0:4], train_labels[0:4]))

我是机器学习的新手,我正在努力学习有关所有概念的更多信息。我想有人可能会指出我正确的方向。

注意:我只有 35 个样本,这是作业的一部分。我无法获得更多数据:(

【问题讨论】:

    标签: machine-learning scipy scikit-learn classification multilabel-classification


    【解决方案1】:

    如果您的数据在任何意义上都不是特定的,那么标准化preprocessing.scale 应该没问题。它强制每个维度具有 0 均值和标准差 1,因此它或多或少会尝试将数据包含在以 0 为中心的球中。值得注意的是你不应该使用normalize,规范化强制每个样本有一个单位规范,它必须通过你的数据来证明(当你强制你的然后将点放置在球体上)。这种情况很少见。

    您的分类器不起作用的原因可能有很多。特别是 - 它是您的测试代码吗?如果是这样:

    • 您不应该只测试 5 个样本,了解交叉验证(可在 scikit-learn 中获得)并运行至少 3 倍的 CV
    • 学习和测试各种超参数。 SVM 至少需要其中的一个(取决于使用的内核,通常从 1 到 4 - 对于 RBF 内核,它的 C 和 gamma,对于 poly C,度数,coef0,...); KNN 约 3(k、公制、权重);逻辑回归至少 1(正则化)
    • 在构建分类器之前 - 查看您的数据。将其绘制在平面 (PCA) 上,尝试在每个特征上绘制投影 - 您的数据的特征是什么?是否平衡?
    • 最重要的是 - 收集更多数据!您在 4000 维空间中有 35 个点......做任何事情的样本数量非常少......如果您不能获得至少 10 倍(最好是 100 倍)的点 - 从将数据的维度降低到大多数 30 维...使用降维(甚至 scikit-learn PCA)。

    【讨论】:

    • 谢谢你。这些数据是我们的教授为一项作业提供的。他只给出了 35 个具有 4000 个特征的样本,而测试数据又多了 15 个样本。我无法获得比这更多的数据。感谢您指出“交叉验证”和“超参数”。直到现在我才使用它们。再次非常感谢您。
    • 那么也要记住降维。
    • @lejlot "Simple PCA" 在样本少于特征时将不起作用。
    • @bogatron 好吧,您仍然可以使用正则化估计协方差并继续进行 PCA,特别是 scikit-learn 的 pca 会这样做(来自 doc)cov = components_.T * S**2 * components_ + sigma2 * eye(n_features);但显然你是对的,对于这个特定的问题,不同的技术会更好。
    • @lejlot 我同意你可以通过正则化来做到这一点,但我不会称之为“简单的 PCA”。
    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2020-06-15
    • 2018-05-18
    • 2014-02-17
    • 2017-12-15
    • 2019-04-27
    • 2015-08-18
    • 2018-03-07
    相关资源
    最近更新 更多