上海制作企业网站,为什么要加强网站安全建设,邢台市政,给公司做网站当你创建了成千上万个特征后#xff0c;就该从中挑选出⼏个了。但是#xff0c;我们绝不应该创建成百上千个⽆⽤的特征。特征过多会带来⼀个众所周知的问题#xff0c;即 维度诅咒。如果你有很多特征#xff0c;你也必须有很多训练样本来捕捉所有特征。什么是 … 当你创建了成千上万个特征后就该从中挑选出⼏个了。但是我们绝不应该创建成百上千个⽆⽤的特征。特征过多会带来⼀个众所周知的问题即 维度诅咒。如果你有很多特征你也必须有很多训练样本来捕捉所有特征。什么是 ⼤量 并没有正确的定义这需要您通过正确验证您的模型和检查训练模型所需的时间来确定。 选择特征的最简单⽅法是 删除⽅差⾮常⼩的特征 。如果特征的⽅差⾮常⼩即⾮常接近于 0它们就接近于常量因此根本不会给任何模型增加任何价值。最好的办法就是去掉它们从⽽降低复杂度。请注意⽅差也取决于数据的缩放。 Scikit-learn 的 VarianceThreshold 实现了这⼀点。 from sklearn.feature_selection import VarianceThreshold
data .
var_thresh VarianceThreshold(threshold0.1)
transformed_data var_thresh.fit_transform(data) 我们还可以删除相关性较⾼的特征。要计算不同数字特征之间的相关性可以使⽤⽪尔逊相关性。 import pandas as pd
from sklearn.datasets import fetch_california_housing
data fetch_california_housing()
X data[data]
col_names data[feature_names]
y data[target]
df pd.DataFrame(X, columnscol_names)
df.loc[:, MedInc_Sqrt] df.MedInc.apply(np.sqrt)
df.corr()
得出相关矩阵如图 1 所⽰。 我们看到MedInc_Sqrt 与 MedInc 的相关性⾮常⾼。因此我们可以删除其中⼀个特征。 现在我们可以转向⼀些 单变量特征选择⽅法 。单变量特征选择只不过是针对给定⽬标对每个特征进⾏评分。 互信息 、 ⽅差分析 F 检验和 chi2 是⼀些最常⽤的单变量特征选择⽅法。在 scikit-learn 中有两种⽅法可以使⽤这些⽅法。 SelectKBest保留得分最⾼的 k 个特征 SelectPercentile保留⽤⼾指定百分⽐内的顶级特征。 必须注意的是只有⾮负数据才能使⽤ chi2。在⾃然语⾔处理中当我们有⼀些单词或基于 tf-idf 的特征时这是⼀种特别有⽤的特征选择技术。最好为单变量特征选择创建⼀个包装器⼏乎可以⽤于任何新问题。 from sklearn.feature_selection import chi2
from sklearn.feature_selection import f_classif
from sklearn.feature_selection import f_regression
from sklearn.feature_selection import mutual_info_classif
from sklearn.feature_selection import mutual_info_regression
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import SelectPercentileclass UnivariateFeatureSelction:def __init__(self, n_features, problem_type, scoring):if problem_type classification:valid_scoring {f_classif: f_classif,chi2: chi2,mutual_info_classif: mutual_info_classif}else:valid_scoring {f_regression: f_regression,mutual_info_regression: mutual_info_regression}if scoring not in valid_scoring:raise Exception(Invalid scoring function)if isinstance(n_features, int):self.selection SelectKBest(valid_scoring[scoring],kn_features)elif isinstance(n_features, float):self.selection SelectPercentile(valid_scoring[scoring],percentileint(n_features * 100))else:raise Exception(Invalid type of feature)def fit(self, X, y):return self.selection.fit(X, y)def transform(self, X):return self.selection.transform(X)def fit_transform(self, X, y):return self.selection.fit_transform(X, y)使⽤该类⾮常简单。
# Example usage:
ufs UnivariateFeatureSelction(n_features0.1,problem_typeregression,scoringf_regression
)
ufs.fit(X, y)
X_transformed ufs.transform(X) 这样就能满⾜⼤部分单变量特征选择的需求。请注意创建较少⽽重要的特征通常⽐创建数以百计的特征要好。单变量特征选择不⼀定总是表现良好。⼤多数情况下⼈们更喜欢使⽤机器学习模型进⾏特征选择。让我们来看看如何做到这⼀点。 使⽤模型进⾏特征选择的最简单形式被称为贪婪特征选择。在贪婪特征选择中第⼀步是选择⼀个模型。第⼆步是选择损失/评分函数。第三步也是最后⼀步是反复评估每个特征如果能提⾼损失/评分就将其添加到 好 特征列表中。没有⽐这更简单的了。但你必须记住这被称为贪婪特征选择是有原因的。这种特征选择过程在每次评估特征时都会适合给定的模型。这种⽅法的计算成本⾮常⾼。完成这种特征选择也需要⼤量时间。如果不正确使⽤这种特征选择甚⾄会导致模型过度拟合。让我们来看看它是如何实现的。 import pandas as pd
from sklearn import linear_model
from sklearn import metrics
from sklearn.datasets import make_classificationclass GreedyFeatureSelection:def evaluate_score(self, X, y):model linear_model.LogisticRegression()model.fit(X, y)predictions model.predict_proba(X)[:, 1]auc metrics.roc_auc_score(y, predictions)return aucdef _feature_selection(self, X, y):good_features []best_scores []num_features X.shape[1]while True:this_feature Nonebest_score 0for feature in range(num_features):if feature in good_features:continueselected_features good_features [feature]xtrain X[:, selected_features]score self.evaluate_score(xtrain, y)if score best_score:this_feature featurebest_score scoreif this_feature is None:breakgood_features.append(this_feature)best_scores.append(best_score)if len(best_scores) 1:if best_scores[-1] best_scores[-2]:breakreturn best_scores[:-1], good_features[:-1]def __call__(self, X, y):scores, features self._feature_selection(X, y)return X[:, features], scoresif __name__ __main__:X, y make_classification(n_samples1000, n_features100)X_transformed, scores GreedyFeatureSelection()(X, y)这种贪婪特征选择⽅法会返回分数和特征索引列表。图 2 显⽰了在每次迭代中增加⼀个新特征后分数是如何提⾼的。我们可以看到在某⼀点之后我们就⽆法提⾼分数了这就是我们停⽌的地⽅。 另⼀种贪婪的⽅法被称为递归特征消除法RFE。在前⼀种⽅法中我们从⼀个特征开始然后不断添加新的特征但在 RFE 中我们从所有特征开始在每次迭代中不断去除⼀个对给定模型提供最⼩值的特征。但我们如何知道哪个特征的价值最⼩呢如果我们使⽤线性⽀持SVM或逻辑回归等模型我们会为每个特征得到⼀个系数该系数决定了特征的重要性。⽽对于任何基于树的模型我们得到的是特征重要性⽽不是系数。在每次迭代中我们都可以剔除最不重要的特征直到达到所需的特征数量为⽌。因此我们可以决定要保留多少特征。 当我们进⾏递归特征剔除时在每次迭代中我们都会剔除特征重要性较⾼的特征或系数接近 0 的特征。请记住当你使⽤逻辑回归这样的模型进⾏⼆元分类时如果特征对正分类很重要其系数就会更正⽽如果特征对负分类很重要其系数就会更负。修改我们的贪婪特征选择类创建⼀个新的递归特征消除类⾮常容易但 scikit-learn 也提供了 RFE。下⾯的⽰例展⽰了⼀个简单的法。 import pandas as pd
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.datasets import fetch_california_housingdata fetch_california_housing()
X data[data]
col_names data[feature_names]
y data[target]model LinearRegression()
rfe RFE(estimatormodel,n_features_to_select3
)
rfe.fit(X, y)
X_transformed rfe.transform(X)我们看到了从模型中选择特征的两种不同的贪婪⽅法。但也可以根据数据拟合模型然后通过特征系数或特征的重要性从模型中选择特征。如果使⽤系数则可以选择⼀个阈值如果系数⾼于该阈值则可以保留该特征否则将其剔除。 让我们看看如何从随机森林这样的模型中获取特征重要性。 import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor
data load_diabetes()
X data[data]
col_names data[feature_names]
y data[target]
model RandomForestRegressor()
model.fit(X, y)
随机森林或任何模型的特征重要性可按如下⽅式绘制。
importances model.feature_importances_
idxs np.argsort(importances)
plt.title(Feature Importances)
plt.barh(range(len(idxs)), importances[idxs], aligncenter)
plt.yticks(range(len(idxs)), [col_names[i] for i in idxs])
plt.xlabel(Random Forest Feature Importance)
plt.show() 结果如图 3 所⽰。 从模型中选择最佳特征并不是什么新鲜事。您可以从⼀个模型中选择特征然后使⽤另⼀个模型进⾏训练。例如你可以使⽤逻辑回归系数来选择特征然后使⽤随机森林Random Forest对所选特征进⾏模型训练。Scikit-learn 还提供了 SelectFromModel 类可以帮助你直接从给定的模型中选择特征。您还可以根据需要指定系数或特征重要性的阈值以及要选择的特征的最⼤数量。 请看下⾯的代码段我们使⽤ SelectFromModel 中的默认参数来选择特征。 import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import SelectFromModel
data load_diabetes()
X data[data]
col_names data[feature_names]
y data[target]
model RandomForestRegressor()
sfm SelectFromModel(estimatormodel)
X_transformed sfm.fit_transform(X, y)
support sfm.get_support()
print([x for x, y in zip(col_names, support) if y True ]) 上⾯程序打印结果 [bmis5]。我们再看图 3就会发现这是最重要的两个特征。因此我们也可以直接从随机森林提供的特征重要性中进⾏选择。我们还缺少⼀件事那就是使⽤ L1 Lasso 惩罚模型 进⾏特征选择。当我们使⽤ L1 惩罚进⾏正则化时⼤部分系数都将为 0或接近 0因此我们要选择系数不为 0 的特征。只需将模型选择⽚段中的随机森林替换为⽀持 L1 惩罚的模型如 lasso 回归即可。所有基于树的模型都提供特征重要性因此本章中展⽰的所有基于模型的⽚段都可⽤于 XGBoost、LightGBM 或 CatBoost。特征重要性函数的名称可能不同产⽣结果的格式也可能不同但⽤法是⼀样的。最后在进⾏特征选择时必须⼩⼼谨慎。在训练数据上选择特征并在验证数据上验证模型以便在不过度拟合模型的情况下正确选择特征。 文章转载自: http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.rgkd.cn.gov.cn.rgkd.cn http://www.morning.bzgpj.cn.gov.cn.bzgpj.cn http://www.morning.twdwy.cn.gov.cn.twdwy.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.wdlyt.cn.gov.cn.wdlyt.cn http://www.morning.tmfhx.cn.gov.cn.tmfhx.cn http://www.morning.nlryq.cn.gov.cn.nlryq.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.gypcr.cn.gov.cn.gypcr.cn http://www.morning.wkrkb.cn.gov.cn.wkrkb.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.hsgxj.cn.gov.cn.hsgxj.cn http://www.morning.bwygy.cn.gov.cn.bwygy.cn http://www.morning.lqzhj.cn.gov.cn.lqzhj.cn http://www.morning.zqsnj.cn.gov.cn.zqsnj.cn http://www.morning.bpzw.cn.gov.cn.bpzw.cn http://www.morning.xfjwm.cn.gov.cn.xfjwm.cn http://www.morning.2d1bl5.cn.gov.cn.2d1bl5.cn http://www.morning.dljujia.com.gov.cn.dljujia.com http://www.morning.gidmag.com.gov.cn.gidmag.com http://www.morning.sjli222.cn.gov.cn.sjli222.cn http://www.morning.lmjtp.cn.gov.cn.lmjtp.cn http://www.morning.gwhjy.cn.gov.cn.gwhjy.cn http://www.morning.cnprt.cn.gov.cn.cnprt.cn http://www.morning.ndmbz.cn.gov.cn.ndmbz.cn http://www.morning.zpkfb.cn.gov.cn.zpkfb.cn http://www.morning.hgsmz.cn.gov.cn.hgsmz.cn http://www.morning.gjxr.cn.gov.cn.gjxr.cn http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn http://www.morning.ddgl.com.cn.gov.cn.ddgl.com.cn http://www.morning.trfh.cn.gov.cn.trfh.cn http://www.morning.snbq.cn.gov.cn.snbq.cn http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn http://www.morning.gwsfq.cn.gov.cn.gwsfq.cn http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.dbxss.cn.gov.cn.dbxss.cn http://www.morning.rnmyw.cn.gov.cn.rnmyw.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn http://www.morning.dnzyx.cn.gov.cn.dnzyx.cn http://www.morning.fglzk.cn.gov.cn.fglzk.cn http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn http://www.morning.yhgbd.cn.gov.cn.yhgbd.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.jrhmh.cn.gov.cn.jrhmh.cn http://www.morning.qmwzz.cn.gov.cn.qmwzz.cn http://www.morning.lkfhk.cn.gov.cn.lkfhk.cn http://www.morning.dxpzt.cn.gov.cn.dxpzt.cn http://www.morning.wflsk.cn.gov.cn.wflsk.cn http://www.morning.btns.cn.gov.cn.btns.cn http://www.morning.hhpbj.cn.gov.cn.hhpbj.cn http://www.morning.rftk.cn.gov.cn.rftk.cn http://www.morning.lwjlj.cn.gov.cn.lwjlj.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.kcsx.cn.gov.cn.kcsx.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.plfrk.cn.gov.cn.plfrk.cn http://www.morning.kbgzj.cn.gov.cn.kbgzj.cn http://www.morning.lbpfl.cn.gov.cn.lbpfl.cn http://www.morning.dwfxl.cn.gov.cn.dwfxl.cn http://www.morning.qgqck.cn.gov.cn.qgqck.cn http://www.morning.wbxrl.cn.gov.cn.wbxrl.cn http://www.morning.rdzgm.cn.gov.cn.rdzgm.cn http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn http://www.morning.jjrsk.cn.gov.cn.jjrsk.cn http://www.morning.rhdqz.cn.gov.cn.rhdqz.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.mplld.cn.gov.cn.mplld.cn http://www.morning.nhrkl.cn.gov.cn.nhrkl.cn http://www.morning.rpzqk.cn.gov.cn.rpzqk.cn http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn http://www.morning.wlnr.cn.gov.cn.wlnr.cn http://www.morning.bccls.cn.gov.cn.bccls.cn http://www.morning.qftzk.cn.gov.cn.qftzk.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.tgts.cn.gov.cn.tgts.cn http://www.morning.zhoer.com.gov.cn.zhoer.com http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn