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

我在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中完成(即创建一个每条记录最大100个特征的df),或者我可以直接使用scikit-learn?

解决方案:

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

  1. 使用信息增益和费舍尔得分等统计方法,计算出你的特征和目标之间的这个分数,然后选择前100名。
  2. 去掉常数或准常数特征
  3. 有前向特征选择和后向特征选择等封装方法,他们的思路是搜索特征空间,选择最佳组合,对于这种方法你可以用 mlxtend.feature_selection 这个软件包与scikit learn相当兼容。
  4. 使用PCA、LDA、……等方法。
  5. 你可以使用嵌入式方法,如Lasso, Ridge或Random forest,使用这个模块从scikit学习:sklearn.feature_selection和导入SelectFromModel。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

让我们的加密证书365天

2022-5-13 16:00:32

解决方案

Android应用程序,得到错误 "java.lang.NullPointerException: println needs a message"。

2022-5-13 16:00:34

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索