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