特征工程用到的一些算法和方法总结

KNN算法(K近邻算法)

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier()
knn.fit(x_train,y_train)
print(knn.score(x_test,y_test))  #准确率

支持向量算法

from sklearn.svm import SVC

无监督分箱

from sklearn.preprocessing import KBinsDiscretizer

kbd = KBinsDiscretizer(n_bins=10,encode='onehot',strategy='uniform')
#n_bins 要分几箱
#encode  #编码方式,独热,常规。。
#strategy  策略:等距,等平。。

交叉验证

from sklearn.model_selection import cross_val_score
score = cross_val_score(estimator,x,y,cv)
#参数分别是: 学习器,x数据,y数据,进行多少次交叉验证
score  #返回的是一组数据,可以用均值查看平均水平

有监督分箱

基于信息熵的分箱 (用的少)
import entropy_based_binning as ebb
df = ebb.bin_array(data,nbins=3,axis=0)
#参数分别是,数据, 要分的箱数(存在一些BUG),轴线

-属性相互依赖最大化分箱
https://github.com/airysen/caimcaim
from caimcaim import CAIMD
caim = CAIMD()
xd = caim.fit_transform(X, y)
xd  #分箱后的结果

特征筛选

  • 过滤法(Filter):按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  • 封装法(Wrapper):根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
  • 嵌入法(Embedded):先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣

贝叶斯算法

from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(x_train,y_train)

流水线

  • 流水线:可以将许多算法模型串联起来,可以结合网格搜索
  • 网格搜索和流水线联合使用,需要指定流水线程序上各个组件的名字和此组件的超参数
from sklearn.pipeline import Pipeline

def get_best(model, params, x, y):
    grid = GridSearchCV(model, params, cv=5, refit=True)  
    grid.fit(x, y)
    print ("准确率: {}".format(grid.best_score_))
    print ("最佳参数: {}".format(grid.best_params_))
    
# 网格搜索可以对流水线上的各个组件的超参数进行交叉组合,前提是需要指定环节的名字和对应的参数
knn_pipe_params = {'classifier__n_neighbors':[3,5,7,9]}
# 创建一个标准化组件
ss = StandardScaler()
# 创建流水线,此流水线上有两个组件,分别是标准化器和分类器(学习器)
knn_pipe = Pipeline([('scale', ss), ('classifier', knn)])
# 因为流水线最后的组件是个学习器,所以可以把流水线对象当做学习器传到网格搜索函数里,并传入流水线上各个组件的参数

#get_best 是一个自己定义的简单的计算准确率和参数的函数,里面的参数可以任意调整,参数对应网格搜索的参数
#x ,y 是数据
get_best(knn_pipe, knn_pipe_params, x, y)

  • 定义类是继承TransformerMixin和 BaseEstimator,可以自动实现一些功能,比如fit 和 transform两个功能,直接调用fit_transform 就可以将两个功能一起实现…
from sklearn.base import TransformerMixin, BaseEstimator

class CustomCorrelationChooser(TransformerMixin, BaseEstimator):
	psaa
# 基于互信息的特征筛选
from sklearn.feature_selection import mutual_info_classif
from sklearn.feature_selection import mutual_info_regression

# 基于方差的特征筛选
from sklearn.feature_selection import VarianceThreshold

# F检验
from sklearn.feature_selection import f_classif
from sklearn.feature_selection import f_regression
#卡方检验
from sklearn.feature_selection import chi2 
"""贝叶斯搜索,和网格搜索差不多"""
from sklearn.model_selection import RandomizedSearchCV
"""贝叶斯搜索,和网格搜索差不多"""
from skopt import BayesSearchCV
"""配合贝叶斯搜素使用"""
from skopt.space import Real, Categorical, Integer

模型融合

from mlxtend.classifier import StackingCVClassifier  #stacking
from mlxtend.plotting import plot_learning_curves
from mlxtend.plotting import plot_decision_regions
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier

clf1 = RandomForestClassifier(n_estimators=100, n_jobs=-1, criterion='gini')
clf2 = ExtraTreesClassifier(n_estimators=50, n_jobs=-1, criterion='gini')
clf3 = ExtraTreesClassifier(n_estimators=50, n_jobs=-1, criterion='entropy')
clf4 = GradientBoostingClassifier(learning_rate=0.05, subsample=0.5, max_depth=6, n_estimators=500)
clf5 = LogisticRegression(solver='lbfgs')

sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3, clf4], meta_classifier=clf5, cv=3)
sclf.fit(train_feat_nn,train_label)
# 5折交叉验证
#scores = cross_val_score(sclf, X, y, cv=3, scoring='accuracy')

y_submission = sclf.predict(valid_feat_nn)

print("Val auc Score of Stacking: %f" % (roc_auc_score(valid_label, y_submission)))
from sklearn.decomposition import PCA   #主成分分析法会,把数据由重要性的强弱前后排序
pca = PCA(n_components=500)  #前500重要
pca.fit_transform(data)  #用X来训练PCA模型,同时返回降维后的数据
pca.explained_variance_ratio_ #返回每一个特征所占的比重
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Weidong He.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值