如何预处理此浮点数据以与scikit一起使用 - 机器学习

时间:2015-11-10 19:35:25

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

我有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个样本,这是作业的一部分。我无法获得更多数据:(

1 个答案:

答案 0 :(得分:2)

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

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

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