Как предварительно обработать эти данные с плавающей запятой для использования с Scikit - Машинное обучение
У меня есть набор данных с 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 ответ
Если ваши данные не являются конкретными в каком-то смысле, то стандартизация preprocessing.scale
должно быть просто отлично. Это заставляет каждое измерение иметь среднее значение 0 и стандартное отклонение 1, поэтому более или менее оно пытается поместить данные в 0-центрированный шар. Стоит отметить, что вы не должны использовать normalize
, нормализация вынуждает каждую выборку иметь единичную норму, это должно быть обосновано вашими данными (так как вы заставляете свои точки быть помещенными на сферу тогда). Это редко бывает.
Там могут быть десятки причин, почему ваши классификаторы не работают. В частности - это ваш тестовый код? Если так:
- вам не следует тестировать только на 5 образцах, изучать перекрестную проверку (доступно в scikit-learn) и запускать как минимум 3-кратное резюме
- изучить и проверить различные гиперпараметры. SVM требует по крайней мере для них (в зависимости от используемого ядра, обычно от 1 до 4 - для ядра RBF его C и гамма, для poly C, степень, coef0, ...); КНН около 3 (к, метрика, вес); Логистическая регрессия не менее 1 (регуляризация)
- прежде чем строить классификаторы - посмотрите на ваши данные. Нанесите его на плоскость (PCA), попробуйте построить проекции для каждого объекта - каковы характеристики ваших данных? Это сбалансировано?
- самое главное - собрать больше данных! У вас 35 точек в 4000-мерном пространстве... это невероятно малое количество выборок, чтобы что-то делать... если вы не можете набрать как минимум в 10 раз (предпочтительно в 100 раз) больше очков - начните с уменьшения размерности ваших данных до большинство 30 измерений... используют уменьшение размерности (даже PCA scikit-learn).