如何减少向量特征的数量?

Pel*_*ide 1 python pandas scikit-learn

我正在 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))
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用具有 300 个特征的 Pandas 数据框作为输入数据。

如何将特征从 300 减少到 100?

一切都必须在 Pandas 中完成(即创建一个每条记录最多 100 个特征的 df),或者我可以直接使用 scikit-learn?

hat*_*oor 6

有很多方法可以减少 ML 模型中的特征数量,这里是其中一些

  1. 使用信息增益和Fisher Score等统计方法,计算你的特征和目标之间的这个分数,然后选择前100
  2. 删除常数或准常数特征
  3. 有前向特征选择和后向特征选择等包装方法,它们的思想是搜索特征空间并为此方法选择最佳组合,您可以使用mlxtend.feature_selection这个包与scikit learn相当兼容
  4. 使用 PCA、LDA、....
  5. 您可以使用嵌入的方法,例如套索、岭或随机森林,使用 scikit 中的此模块学习:sklearn.feature_selection 并导入 SelectFromModel