Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 参数调整和特征工程,哪一个应该是第一个?_Machine Learning_Classification_Svm_Feature Selection - Fatal编程技术网

Machine learning 参数调整和特征工程,哪一个应该是第一个?

Machine learning 参数调整和特征工程,哪一个应该是第一个?,machine-learning,classification,svm,feature-selection,Machine Learning,Classification,Svm,Feature Selection,我正在尝试训练一个SVM分类器,但我对ML是一个新手。我知道这里有两个步骤:参数调整和特征工程,但哪一个先进行?似乎答案建议先做特征工程,对吗?如果正确,我是否随机选取一组SVM参数来进行特征工程?您必须首先执行特征工程/特征选择。在调整值之前,您必须知道将使用哪些变量 至于如何进行特征选择,这是另一个问题。您可以使用一种技术,例如,或许多其他技术。这是一个活跃的研究领域,如果你在谷歌上搜索,你会发现很多描述各种技术的论文 是我最近读到的一篇文章,它使用基于熵的技术进行特征选择。SVM(以及大多

我正在尝试训练一个SVM分类器,但我对ML是一个新手。我知道这里有两个步骤:参数调整和特征工程,但哪一个先进行?似乎答案建议先做特征工程,对吗?如果正确,我是否随机选取一组SVM参数来进行特征工程?

您必须首先执行特征工程/特征选择。在调整值之前,您必须知道将使用哪些变量

至于如何进行特征选择,这是另一个问题。您可以使用一种技术,例如,或许多其他技术。这是一个活跃的研究领域,如果你在谷歌上搜索,你会发现很多描述各种技术的论文

是我最近读到的一篇文章,它使用基于熵的技术进行特征选择。

SVM(以及大多数其他ML方法)接受二维数字特征矩阵形式的输入,因此您必须将数据转换为该格式才能使用SVM。因此,虽然您希望在参数调优之前进行一些功能工程,以确认管道的工作方式符合您的预期,但不一定需要将两者完全分开

如果使用自动或参数化特征工程方法,则该方法可以作为超参数优化过程的一部分

实现这一点的一种方法是使用Python中的开源自动化特性工程库和机器学习库,如

以下是使用Featuretools中的演示数据集的管道,该数据集在同一步骤中执行超参数优化和功能工程:

import featuretools as ft
from featuretools.primitives import (Sum, Max, Mean, Min,
                                     Percentile, Day, Weekend, Weekday)
from featuretools.selection import remove_low_information_features
from itertools import combinations
from sklearn.metrics import f1_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler, Imputer


retail_data = ft.demo.load_retail(nrows=1000)
# predict each customer's country
labels = LabelEncoder().fit_transform(retail_data['customers'].df['Country'])

def score_pipeline(max_depth, agg_primitives, trans_primitives, C):
    feature_matrix, feature_defs = ft.dfs(entityset=retail_data,
                                          target_entity='customers',
                                          ignore_variables={'customers': ['Country']},
                                          max_depth=max_depth,
                                          agg_primitives=agg_primitives,
                                          trans_primitives=trans_primitives,
                                          verbose=True)
    # one-hot encode to transform to numeric
    feature_matrix, feature_defs = ft.encode_features(feature_matrix, feature_defs)
    # remove feature with all nans or all single value
    feature_matrix, feature_defs = remove_low_information_features(feature_matrix, feature_defs)
    # impute missing values
    imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)
    feature_matrix = imputer.fit_transform(feature_matrix)

    model = SVC(C=C, verbose=True)
    X_train, X_test, y_train, y_test = train_test_split(feature_matrix,
    labels, test_size=0.1)
    model.fit(X_train, y_train)
    predictions = model.predict(X_test)
    return f1_score(y_test, predictions, average='macro')

poss_agg_primitives = [Sum, Max, Mean, Min]
poss_trans_primitives = [Percentile, Day, Weekend, Weekday]
scores = []
for agg_primitives in combinations(poss_agg_primitives, 2):
    for trans_primitives in combinations(poss_trans_primitives, 2):
        for max_depth in range(1, 3):
            for C in [0.01, 0.1, 1.0]:
                score = score_pipeline(max_depth,
                                       agg_primitives,
                                       trans_primitives,
                                       C)
                scores.append(score)
print("Best score: {:.3f}".format(max(scores)))

特征工程应该首先完成。按照下面的顺序

  • 缺失值插补
  • 变量编码
  • 处理异常值
  • 选择特征的线性模型假设
  • 选择主要与标签相关的要素
  • 这些是特征工程的一些基本步骤。除此之外,这在很大程度上取决于您正在处理的数据集类型

    所有机器学习模型的性能取决于我们如何从所有可用数据集创建独特的功能
  • 特征工程
    然后检查特征之间的相关性以删除相关特征
  • 参数调谐

  • 在训练模型之前,需要创建特征和训练集,因此特征工程的第一次迭代必须在参数调整之前进行。然而,特征工程和参数调整都是迭代过程。例如,您可以使用功能的第一个版本使用网格搜索(暴力搜索最佳参数)来训练模型,然后您可以使用这些参数来尝试功能的不同排列。例如,您可以尝试使用功能X的一些变体,例如log(X)、sqrt(X)、X^2等,以查看这是否会提供更好的结果

    我的典型过程是:

  • 特写头脑风暴
  • 特征创建
  • 相关分析
  • 特征选择
  • 特征变换(使其尽可能与目标线性相关)
  • 特征缩放到1-平均单位方差
  • 网格搜索以查找算法的初始超参数
  • 测试替代特征变换的迭代过程
  • 测试更精细的超参数的迭代过程