#python #python-3.x #machine-learning #scikit-learn #feature-selection
#python #python-3.x #машинное обучение #scikit-learn #функция-выбор
Вопрос:
Я пытаюсь использовать рекурсивное устранение функций scikit learn с перекрестной проверкой для (5000, 37)
данных, у которых есть проблема с двоичным классом, и всякий раз, когда я подхожу к модели, алгоритм переходит в бесконечный цикл. В настоящее время я следую этому примеру: https://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html о том, как использовать этот алгоритм.
Мои данные:
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
X = np.random.randint(0,363175645.191632,size=(5000, 37))
Y = np.random.choice([0, 1], size=(37,))
Что я пытался сделать, чтобы выбрать функции с помощью:
svc = SVC(kernel="linear")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),
scoring='accuracy')
rfecv.fit(X, Y)
Код зависает и переходит в бесконечный цикл, однако, когда я пытаюсь использовать другой алгоритм, такой как ExtraTreesClassifier, он работает просто отлично, что происходит, пожалуйста, помогите?
Ответ №1:
Когда вы выполняете svm, поскольку он основан на расстоянии, имеет смысл масштабировать ваши переменные объектов, особенно в вашем случае, когда они огромны. вы также можете ознакомиться с этим введением к svm. Использование примера набора данных:
from sklearn.datasets import make_blobs
import seaborn as sns
import numpy as np
from sklearn.preprocessing import StandardScaler
Scaler = StandardScaler()
X, y = make_blobs(n_samples=5000, centers=3, shuffle=False,random_state=42)
X = np.concatenate((X,np.random.randint(0,363175645.191632,size=(5000,35))),axis=1)
y = (y==1).astype('int')
X_scaled = Scaler.fit_transform(X)
Этот набор данных содержит только 2 полезные переменные в первых двух столбцах, как вы можете видеть из графика:
plt.scatter(x=X_scaled[:,0],y=X_scaled[:,1],c=['k' if i else 'b' for i in y])
Теперь мы запускаем rfe для масштабированных данных, и мы видим, что он возвращает первые два столбца в качестве главных переменных:
from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
svc = SVC(kernel="linear")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),scoring='accuracy')
rfecv.fit(X_scaled, y)
rfecv.ranking_
array([ 1, 2, 17, 28, 33, 22, 23, 26, 6, 19, 20, 4, 10, 25, 3, 27, 11,
8, 18, 5, 29, 14, 7, 21, 9, 13, 24, 30, 35, 31, 32, 34, 16, 36,
37, 12, 15])
Комментарии:
1. Должен ли я масштабировать данные?
2. да, вы определенно должны. также можно попробовать minmax