python数据挖掘中比较实用的几个特征选择方法

这篇文章主要介绍“python数据挖掘中比较实用的几个特征选择方法”,在日常操作中,相信很多人在python数据挖掘中比较实用的几个特征选择方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python数据挖掘中比较实用的几个特征选择方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

成都创新互联公司主要从事网站建设、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务泗水,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

对于从事数据分析、数据挖掘的小伙伴来说,特征选择是绕不开的话题,是数据挖掘过程中不可或缺的环节。好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。

特征选择作用

  • 减少特征数量、降维,使模型泛化能力更强,减少过拟合

  • 增强对特征和特征值之间的理解

特征选择方法介绍

1.特征重要性

在特征的选择过程中,学习器是树模型的话,可以根据特征的重要性来筛选有效的特征,在sklearn中,GBDT和RF的特征重要性计算方法是相同的,都是基于单棵树计算每个特征的重要性,探究每个特征在每棵树上做了多少的贡献,再取个平均值。单棵树上特征的重要性定义为:特征在所有非叶节在分裂时加权不纯度的减少,减少的越多说明特征越重要

import numpy as npfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.externals.six import StringIOfrom sklearn import treeimport pydotplusclf = DecisionTreeClassifier()x = [[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],     [1,1,2,2,1,1,1,2,1,1,1,1,2,2,1],     [1,1,1,2,1,1,1,2,2,2,2,2,1,1,1],     [1,2,2,1,1,1,2,2,3,3,3,2,2,3,1]     ]y =  [1,1,2,2,1,1,1,2,2,2,2,2,2,2,1]x = np.array(x)x = np.transpose(x)clf.fit(x,y)print(clf.feature_importances_)feature_name = ['A1','A2','A3','A4']target_name = ['1','2']dot_data = StringIO()tree.export_graphviz(clf,out_file = dot_data,feature_names=feature_name,                     class_names=target_name,filled=True,rounded=True,                     special_characters=True)graph = pydotplus.graph_from_dot_data(dot_data.getvalue())graph.write_pdf("Tree.pdf")

2.回归模型的系数

越是重要的特征在模型中对应的系数就会越大,而跟输出变量越是无关的特征对应的系数就会越接近于0。在噪音不多的数据上,或者是数据量远远大于特征数的数据上,如果特征之间相对来说是比较独立的,那么即便是运用最简单的线性回归模型也一样能取得非常好的效果。

from sklearn.linear_model import LinearRegressionimport numpy as npnp.random.seed(0)size = 5000#A dataset with 3 featuresX = np.random.normal(0, 1, (size, 3))#Y = X0 + 2*X1 + noiseY = X[:,0] + 2*X[:,1] + np.random.normal(0, 2, size)lr = LinearRegression()lr.fit(X, Y)#A helper method for pretty-printing linear modelsdef pretty_print_linear(coefs, names = None, sort = False):    if names == None:        names = ["X%s" % x for x in range(len(coefs))]    lst = zip(coefs, names)    if sort:        lst = sorted(lst,  key = lambda x:-np.abs(x[0]))    return " + ".join("%s * %s" % (round(coef, 3), name)                                   for coef, name in lst)
print "Linear model:", pretty_print_linear(lr.coef_)

3.平均精确率减少

平均精确率减少就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。这个方法sklearn中没有直接提供,但是很容易实现

from sklearn.cross_validation import ShuffleSplitfrom sklearn.metrics import r2_scorefrom collections import defaultdict
X = boston["data"]Y = boston["target"]
rf = RandomForestRegressor()scores = defaultdict(list)
#crossvalidate the scores on a number of different random splits of the datafor train_idx, test_idx in ShuffleSplit(len(X), 100, .3):    X_train, X_test = X[train_idx], X[test_idx]    Y_train, Y_test = Y[train_idx], Y[test_idx]    r = rf.fit(X_train, Y_train)    acc = r2_score(Y_test, rf.predict(X_test))    for i in range(X.shape[1]):        X_t = X_test.copy()        np.random.shuffle(X_t[:, i])        shuff_acc = r2_score(Y_test, rf.predict(X_t))        scores[names[i]].append((acc-shuff_acc)/acc)print "Features sorted by their score:"print sorted([(round(np.mean(score), 4), feat) for              feat, score in scores.items()], reverse=True)

到此,关于“python数据挖掘中比较实用的几个特征选择方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


当前名称:python数据挖掘中比较实用的几个特征选择方法
当前地址:http://azwzsj.com/article/giohgd.html