Код входит в бесконечный цикл при попытке выбора объектов

#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