Как уменьшить количество векторных функций? - PullRequest
0 голосов
/ 23 апреля 2020

Я делаю перекрестную проверку в Scikit-Learn. Вот сценарий:

import pandas as pd
import numpy as np
from time import time
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.metrics import classification_report, accuracy_score, make_scorer
from sklearn.model_selection._validation import cross_val_score
from sklearn.model_selection import GridSearchCV, KFold, StratifiedKFold

r_filenameTSV = "TSV/A19784.tsv"

#DF 300 dimension start

tsv_read = pd.read_csv(r_filenameTSV, sep='\t', names=["vector"])

df = pd.DataFrame(tsv_read)

df = pd.DataFrame(df.vector.str.split(" ", 1).tolist(), columns=['label', 'vector'])

print(df)

#DF 300 dimension end


y = pd.DataFrame([df.label]).astype(int).to_numpy().reshape(-1, 1).ravel()
print(y.shape)

X = pd.DataFrame([dict(y.split(':') for y in x.split()) for x in df['vector']])
print(X.astype(float).to_numpy())
print(X)

start = time()

clf = svm.SVC(kernel='rbf',
              C=32,
              gamma=8,
              )

print("K-Folds scores:")


originalclass = []
predictedclass = []


def classification_report_with_accuracy_score(y_true, y_pred):
    originalclass.extend(y_true)
    predictedclass.extend(y_pred)
    return accuracy_score(y_true, y_pred)  # return accuracy score


inner_cv = StratifiedKFold(n_splits=10)
outer_cv = StratifiedKFold(n_splits=10)


# Nested CV with parameter optimization
nested_score = cross_val_score(clf, X=X, y=y, cv=outer_cv,
                               scoring=make_scorer(classification_report_with_accuracy_score))

# Average values in classification report for all folds in a K-fold Cross-validation  
print(classification_report(originalclass, predictedclass))
print("10 folds processing seconds: {}".format(time() - start))

Как вы видите, я использую в качестве входных данных фрейм данных Pandas, который имеет 300 функций.

Как уменьшить функцию с 300 до 100 ?

Все должно быть сделано в Pandas (то есть создание df с максимум 100 функциями на запись), или я могу использовать непосредственно scikit-learn?

1 Ответ

4 голосов
/ 23 апреля 2020

Есть много способов уменьшить количество функций в моделях ML, вот некоторые из них

  1. использовать статистические методы, такие как Information Gain и Fisher Score, вычислить эту оценку между вашими функциями и целью и затем выберите top 100
  2. удалить константные или квазипостоянные элементы
  3. Существуют методы-оболочки, такие как прямой выбор объектов и обратный выбор объектов, и их идея состоит в том, чтобы искать пространство объектов и выбирать для этого наилучшую комбинацию. метод, который вы можете использовать mlxtend.feature_selection этот пакет довольно совместим с scikit learn
  4. использовать PCA, LDA, ....
  5. вы можете использовать встроенные методы, такие как Lasso , Хребет или Случайный лес используют этот модуль из scikit learn: sklearn.feature_selection и import SelectFromModel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...