如何预处理此浮点数据以用于 scikit - 机器学习
How to preprocess this floating point data to use with scikit - Machine Learning
我有包含 4000 个特征和 35 个样本的数据集。所有特征都是1到3之间的浮点数。例如:2.68244527684596.
我正在努力让任何分类器处理这些数据。我用过 knn, svm (with linear,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 个样本,这是作业的一部分。我无法获得更多数据:(
如果您的数据在任何意义上都不具体,那么标准化 preprocessing.scale
应该就可以了。它强制每个维度的均值为 0,标准差为 1,因此它或多或少地尝试将数据封装在一个以 0 为中心的球中。值得注意的是you should not use normalize
, normalize forces each sample to have a unit norm, it has to be justified根据您的数据(当您强制将点放置 在球体上 时)。这种情况很少见。
分类器不起作用的原因可能有很多。特别是 - 它是您的测试代码吗?如果是:
- 你不应该只测试 5 个样本,了解交叉验证(在 scikit-learn 中可用)和 运行 至少 3 倍 CV
- 学习和测试各种超参数。 SVM 至少需要它们中的一个(取决于使用的内核,通常是 1 到 4 - 对于 RBF 内核,它的 C 和伽玛,对于 poly C,度数,coef0,...); KNN 大约 3(k,度量,权重);逻辑回归至少 1(正则化)
- 在构建分类器之前 - 查看您的数据。将其绘制在平面上 (PCA),尝试绘制每个特征的投影 - 您的数据有哪些特征?它是平衡的吗?
- 最重要的是 - 收集更多数据!你在 4000 维 space 中有 35 个点......做任何事情的样本数量少得离谱......如果你不能获得至少 10 倍(最好是 100 倍)的点 - 从减少维数开始您的数据最多 30 个维度...使用降维(甚至 scikit-learn PCA)。
我有包含 4000 个特征和 35 个样本的数据集。所有特征都是1到3之间的浮点数。例如:2.68244527684596.
我正在努力让任何分类器处理这些数据。我用过 knn, svm (with linear,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 个样本,这是作业的一部分。我无法获得更多数据:(
如果您的数据在任何意义上都不具体,那么标准化 preprocessing.scale
应该就可以了。它强制每个维度的均值为 0,标准差为 1,因此它或多或少地尝试将数据封装在一个以 0 为中心的球中。值得注意的是you should not use normalize
, normalize forces each sample to have a unit norm, it has to be justified根据您的数据(当您强制将点放置 在球体上 时)。这种情况很少见。
分类器不起作用的原因可能有很多。特别是 - 它是您的测试代码吗?如果是:
- 你不应该只测试 5 个样本,了解交叉验证(在 scikit-learn 中可用)和 运行 至少 3 倍 CV
- 学习和测试各种超参数。 SVM 至少需要它们中的一个(取决于使用的内核,通常是 1 到 4 - 对于 RBF 内核,它的 C 和伽玛,对于 poly C,度数,coef0,...); KNN 大约 3(k,度量,权重);逻辑回归至少 1(正则化)
- 在构建分类器之前 - 查看您的数据。将其绘制在平面上 (PCA),尝试绘制每个特征的投影 - 您的数据有哪些特征?它是平衡的吗?
- 最重要的是 - 收集更多数据!你在 4000 维 space 中有 35 个点......做任何事情的样本数量少得离谱......如果你不能获得至少 10 倍(最好是 100 倍)的点 - 从减少维数开始您的数据最多 30 个维度...使用降维(甚至 scikit-learn PCA)。