精华内容
下载资源
问答
  • LassoCV特征选择

    千次阅读 2019-09-23 10:57:33
    from sklearn.linear_model import Lasso from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_boston from sklearn.model_selection import cross_val_score boston = lo...

    1、加载数据

    from sklearn.linear_model import Lasso
    from sklearn.preprocessing import StandardScaler
    from sklearn.datasets import load_boston
    from sklearn.model_selection import cross_val_score
    
    boston = load_boston()
    scaler = StandardScaler()
    X = scaler.fit_transform(boston["data"])
    Y = boston["target"]
    names = boston["feature_names"]
    

    2、选择最优的正则化参数

    from sklearn.linear_model import LassoCV
    model_lasso = LassoCV(alphas = [0.1,1,0.001, 0.0005]).fit(X,Y)
    model_lasso.alpha_
    

    在这里插入图片描述
    3、输出看模型最终选择了几个特征向量,剔除了几个特征向量

    import pandas as pd
    coef = pd.Series(model_lasso.coef_, index = names)
    print("Lasso picked " + str(sum(coef != 0)) + " variables and eliminated the other " +  str(sum(coef == 0)) + " variables")
    

    在这里插入图片描述
    4、画出特征变量的重要程度

    import matplotlib
    imp_coef = pd.concat([coef.sort_values().head(3),
                         coef.sort_values().tail(3)])
    
    matplotlib.rcParams['figure.figsize'] = (8.0, 10.0)
    coef.plot(kind = "barh")
    plt.title("Coefficients in the Lasso Model")
    plt.show() 
    
    展开全文
  • sklearn机器学习:特征选择-Lasso

    千次阅读 2019-10-11 10:42:27
    Lasso的核心作用:特征选择 Lasso类的格式 sklearn.linear_model.Lasso (alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive...

    Lasso的核心作用:特征选择

    Lasso类的格式

    sklearn.linear_model.Lasso (alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection=’cyclic’)
    sklearn中使用类Lasso来调用lasso回归,众多参数中,比较重要的就是正则化系数α。另外需要注意的就是参数positive。当这个参数为"True"的时候,要求Lasso回归出的系数必须为正数,以此来保证α一定以增大来控制正则化的程度。
    注意,sklearn中使用的损失函数是:
    minω12mXωy22+αω1\large\boldsymbol{\mathop{min}\limits_\omega\frac1{2m}||X\omega-y||_2\,^2+\alpha||\omega||_1}
    其中12m\Large\frac1{2m}(即:1nsamples\Large\frac1{n_{samples}})只是作为系数存在,用来消除损失函数求导后多出来的那个2的(求解ω时所带的1/2),然后对整体的RSS求平均而已,无论时从损失函数的意义来看还是从Lasso的性质和功能来看,这个变化没有造成任何影响,只不过让计算更加简便。
    接下来,看看lasso如何做特征选择:

    #Lasso做特征选择与线性回归和岭回归的比较
    import numpy as np
    import pandas as pd
    from sklearn.linear_model import Ridge, LinearRegression, Lasso
    from sklearn.model_selection import train_test_split as TTS
    from sklearn.datasets import fetch_california_housing as fch
    import matplotlib.pyplot as plt
    housevalue = fch()
    X = pd.DataFrame(housevalue.data)
    y = housevalue.target
    X.columns = ["住户收⼊入中位数","房屋使⽤用年年代中位数","平均房间数⽬目"
    ,"平均卧室数⽬目","街区⼈人⼝口","平均⼊入住率","街区的纬度","街区的经度"]
    X.head()
    Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)
    #恢复索引
    for i in [Xtrain,Xtest]:
        i.index = range(i.shape[0])
    #线性回归进行拟合
    reg = LinearRegression().fit(Xtrain,Ytrain)
    (reg.coef_*100).tolist()
    
    [43.73589305968403,
     1.0211268294494038,
     -10.780721617317715,
     62.64338275363783,
     5.216125353178735e-05,
     -0.33485096463336095,
     -41.30959378947711,
     -42.621095362084674]
    
    #岭回归进⾏拟合
    Ridge_ = Ridge(alpha=0).fit(Xtrain,Ytrain)
    (Ridge_.coef_*100).tolist()
    
    [43.735893059684045,
     1.0211268294494151,
     -10.780721617317626,
     62.64338275363741,
     5.2161253532713044e-05,
     -0.3348509646333588,
     -41.3095937894767,
     -42.62109536208427]
    
    #Lasso进行拟合
    lasso_ = Lasso(alpha=0).fit(Xtrain,Ytrain)
    (lasso_.coef_*100).tolist()
    
    [43.735893059684024,
     1.0211268294494056,
     -10.78072161731769,
     62.64338275363792,
     5.2161253532654165e-05,
     -0.33485096463335706,
     -41.3095937894772,
     -42.62109536208478]
    

    可以看到,岭回归没有报出错误,但Lasso虽然依然对系数进行了计算,但是报出了整整三个红条:
    在这里插入图片描述
    这三条分别是这样的内容:

    1. 正则化系数为0,这样算法不可收敛!如果你想让正则化系数为0,请使用线性回归
    2. 没有正则项的坐标下降法可能会导致意外的结果,不鼓励这样做!
    3. 目标函数没有收敛,你也许想要增加迭代次数,使用一个非常小的alpha来拟合模型可能会造成精确度问题!

    看到这三条内容,大家可能会比较懵——怎么出现了坐标下降?这是由于sklearn中的Lasso类不是使用最小二乘法来进行求解,而是使用坐标下降。考虑一下,Lasso既然不能够从根本解决多重共线性引起的最小二乘法无法使用的问题,那为什么要坚持最小二乘法呢?明明有其他更快更好的求解方法,比如坐标下降。下面两篇论文解释了了scikit-learn坐标下降求解器中使用的迭代方式,以及用于收敛控制的对偶间隙计算方式,感兴趣的可以阅读。
    使用坐标下降法求解Lasso:
    “Regularization Path For Generalized linear Models by Coordinate Descent”, Friedman, Hastie & Tibshirani, J Stat Softw, 2010 (Paper).
    https://www.jstatsoft.org/article/view/v033i01/v33i01.pdf
    “An Interior-Point Method for Large-Scale L1-Regularized Least Squares,” S. J. Kim, K. Koh, M. Lustig, S. Boyd and D. Gorinevsky, in IEEE Journal of Selected Topics in Signal Processing, 2007 (Paper)
    https://web.stanford.edu/~boyd/papers/pdf/l1_ls.pdf
    有了坐标下降,就有迭代和收敛的问题,因此sklearn不推荐我们使用0这样的正则化系数。如果我们的确希望取到0,可以使用一个比较很小的数,比如0.01,或者10*e-3这样的值:

    #岭回归进行拟合
    Ridge_ = Ridge(alpha=0.01).fit(Xtrain,Ytrain)
    (Ridge_.coef_*100).tolist()
    
    [43.73575720621605,
     1.0211292318121836,
     -10.780460336251702,
     62.64202320775686,
     5.217068073243689e-05,
     -0.3348506517067627,
     -41.3095714322911,
     -42.62105388932374]
    
    #Lasso进行拟合
    lasso_ = Lasso(alpha=0.01).fit(Xtrain,Ytrain)
    (lasso_.coef_*100).tolist()
    
    [40.10568371834486,
     1.0936292607860143,
     -3.7423763610244487,
     26.524037834897207,
     0.0003525368511503945,
     -0.3207129394887799,
     -40.06483047344844,
     -40.81754399163315]
    

    这样就不会报错了。

    #加⼤正则项系数,观察模型的系数发⽣了什么变化
    Ridge_ = Ridge(alpha=10**4).fit(Xtrain,Ytrain)
    (Ridge_.coef_*100).tolist()
    
    [34.620815176076945,
     1.5196170869238694,
     0.3968610529210133,
     0.9151812510354866,
     0.002173923801224843,
     -0.34768660148101016,
     -14.736963474215257,
     -13.43557610252691]
    
    lasso_ = Lasso(alpha=10**4).fit(Xtrain,Ytrain)
    (lasso_.coef_*100).tolist()
    
    [0.0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0]
    
    #看来10**4对于Lasso取值过大
    lasso_ = Lasso(alpha=1).fit(Xtrain,Ytrain)
    (lasso_.coef_*100).tolist()
    
    [14.581141247629423,
     0.6209347344423876,
     0.0,
     -0.0,
     -0.00028065986329009983,
     -0.0,
     -0.0,
     -0.0]
    
    #将系数进⾏绘图
    plt.plot(range(1,9),(reg.coef_*100).tolist(),color="red",label="LR")
    plt.plot(range(1,9),(Ridge_.coef_*100).tolist(),color="orange",label="Ridge")
    plt.plot(range(1,9),(lasso_.coef_*100).tolist(),color="k",label="Lasso")
    plt.plot(range(1,9),[0]*8,color="grey",linestyle="--")
    plt.xlabel('w') #横坐标是每⼀个特征所对应的系数
    plt.legend()
    plt.show()
    

    在这里插入图片描述
    可见,比起岭回归,Lasso所带的L1正则项对于系数的惩罚要重得多,并且它会将系数压缩至0,因此可以被用来做特征选择。也因此,往往让Lasso的正则化系数在很小的空间中变动,以此来寻找最佳的正则化系数。
    到这里,岭回归和Lasso的核心作用讲解完毕。
    Lasso作为线性回归家族中在改良上走得最远的算法,还有许多领域待探讨。比如,现实中,不仅可以适用交叉验证来选择最佳正则化系数,也可以使用BIC( 贝叶斯信息准则)或者AIC(Akaike information criterion,艾凯克信息准则)来做模型选择。同时,可以不使用坐标下降法,而使用最小角度回归来对lasso进行计算。

    注:
    AIC和BIC主要用于模型的选择,AIC、BIC越小越好。
    对不同模型进行比较时,AIC、BIC降低越多,说明该模型的拟合效果越好
    AIC=2(模型参数的个数)-2ln(模型的极大似然函数)
    BIC = ln(n)(模型中参数的个数) - 2ln(模型的极大似然函数值)
    或表示为:
    AIC=-2 ln(L) + 2 k 准则akaike information criterion
    BIC=-2 ln(L) + ln(n)*k 准则bayesian information criterion
    HQ=-2 ln(L) + ln(ln(n))*k 准则hannan-quinn criterion
    其中L是在该模型下的最大似然,n是数据数量,k是模型的变量个数。

    展开全文
  • 1.lasso(下面的case实验成功,在6w+,163维度上未实验成功,可能由于特征的区分度不足引发) from sklearn.linear_model import RandomizedLasso from sklearn.datasets import load_boston boston = load_boston...

    1.lasso(下面的case实验成功,在6w+,163维度上未实验成功,可能由于特征的区分度不足引发)

    from sklearn.linear_model import RandomizedLasso
    from sklearn.datasets import load_boston
    boston = load_boston()
    
    #using the Boston housing data. 
    #Data gets scaled automatically by sklearn's implementation
    X = boston["data"]
    Y = boston["target"]
    names = boston["feature_names"]
    
    rlasso = RandomizedLasso(alpha=0.025)
    rlasso.fit(X, Y)
    
    print "Features sorted by their score:"
    print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), 
                     names), reverse=True)

    2.通过模型设置特征

    2.1 通过logistic进行筛选:linear_model.LogisticRegression(C=0.4,penalty='l1',solver='liblinear')  C为正则项目,C值约小,特征中为0的项目约多,反之越少

    展开全文
  • 去掉方差较小的特征方差阈值(VarianceThreshold)是特征选择的一个简单方法,去掉那些方差没有达到阈值的特征。默认情况下,删除零方差的特征,例如那些只有一个值的样本。假设我们有一个有布尔特征的数据集,然后...

    去掉方差较小的特征

    方差阈值(VarianceThreshold)是特征选择的一个简单方法,去掉那些方差没有达到阈值的特征。默认情况下,删除零方差的特征,例如那些只有一个值的样本。

    假设我们有一个有布尔特征的数据集,然后我们想去掉那些超过80%的样本都是0(或者1)的特征。布尔特征是伯努利随机变量,方差为 p(1-p)。

    from sklearn.feature_selection import VarianceThreshold

    X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]

    sel = VarianceThreshold(threshold=(.8 * (1 - .8)))

    sel.fit_transform(X)

    array([[0, 1],

    [1, 0],

    [0, 0],

    [1, 1],

    [1, 0],

    [1, 1]])

    VarianceThreshold去掉了第一列,第一列里面0的比例为5/6。

    单变量特征选择

    单变量特征选择通过单变量统计检验选择特征,可以看作一个估计器的预处理步骤。Sklearn将特征选择视为日常的转换操作:

    SelectBest 只保留 k 个最高分的特征;

    SelectPercentile 只保留用户指定百分比的最高得分的特征;

    使用常见的单变量统计检验:假正率SelectFpr,错误发现率selectFdr,或者总体错误率SelectFwe;

    GenericUnivariateSelect 通过结构化策略进行特征选择,通过超参数搜索估计器进行特征选择。

    举个例子,使用卡方检验选择两个最优特征:

    from sklearn.datasets import load_iris

    from sklearn.feature_selection import SelectKBest

    from sklearn.feature_selection import chi2

    iris = load_iris()

    X, y = iris.data, iris.target

    X.shape

    (150, 4)

    X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

    X_new.shape

    (150, 2)

    SelectKBest和SelectPerecntile能够返回特征评价的得分和P值:

    sklearn.feature_selection.SelectPercentile(score_func=, percentile=10)

    sklearn.feature_selection.SelectKBest(score_func=, k=10

    其中的参数 score_func 有以下选项:

    回归:

    f_regression:相关系数,计算每个变量与目标变量的相关系数,然后计算出F值和P值;

    degrees_of_freedom = y.size - (2 if center else 1)

    F = corr ** 2 / (1 - corr ** 2) * degrees_of_freedom

    pv = stats.f.sf(F, 1, degrees_of_freedom)

    mutual_info_regression:互信息,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。

    参考:http://www.cnblogs.com/gatherstars/p/6004075.html

    分类 :

    chi2:卡方检验;

    f_classif:方差分析,计算方差分析(ANOVA)的F值 (组间均方 / 组内均方);

    mutual_info_classif:互信息,互信息方法可以捕捉任何一种统计依赖,但是作为非参数方法,需要更多的样本进行准确的估计。

    递归特征淘汰(RFE)

    给特征赋予一个外部模型产生的权重(例如:线性模型系数),RFE递归地使用越来越少的特征来进行特征选择。首先,在原始数据上建立模型并且给每个特征一个权重;然后,淘汰绝对权重最小的特征,递归地执行这个过程直到达到希望的特征数。

    RFECV使用交叉验证方法发现最优特征数量。

    使用SelectFromModel方法特征选择

    SelectFromModel是一种元转换器,可以与那些有coef_ 或者feature_importances_属性的模型一起使用。如果coef_ 或者feature_importances_小于阈值,我们就认为特征是不重要的。除了指定阈值以外,也可以使用启发式的方式。有效的启发式方法包括均值、中位数或者乘以系数,比如 0.1*均值。

    基于L1范数的特征选择

    使用L1范数的线性模型有一个稀疏解:许多估计系数都为0。当降维的目的是为了使用其他分类器,他们能和feature_selection.SelectFromModel一起使用选择非零系数。特别地,稀疏估计量对于回归中的 linear_model.Lasso、分类中的linear_model.LogisticRegression和svm.LinearSVC都很有用。

    from sklearn.svm import LinearSVC

    from sklearn.datasets import load_iris

    from sklearn.feature_selection import SelectFromModel

    iris = load_iris()

    X, y = iris.data, iris.target

    X.shape

    (150,4)

    lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)

    model = SelectFromModel(lsvc, prefit=True)

    X_new = model.transform(X)

    X_new.shape

    (150,3)

    在SVM和Logistic回归中,参数 C 控制着稀疏性,C越小选择的特征越少。在Lasso中,参数 alpha越大,选择的特征越少。

    随机稀疏模型

    就特征选择而言,在回归和分类中使用L1正则有众所周知的局限。例如,Lasso将从一组高度相关的特征中选择一个;此外,即使特征间的相关性并不强,L1正则仍然会从中选出一个“好”的特征。

    为了解决这个问题,可以使用sklearn.linear_model中的stability selection这种随机化方法。在stability selection中,使用数据的子集去拟合模型,系数的随机子集的罚项将被缩小( the penalty of a random subset of coefficients has been scaled)。

    其中

    是公平伯努利随机变量的独立试验( independent trials of a fair Bernoulli random variable),0

    RandomizedLasso在 Lasso 回归中使用了这个策略,RandomizedLogisticRegression 可以用来分类。要获得整个过程中的全部得分,可以使用lasso_stability_path。

    随机稀疏模型比标准的 F统计量在探测非零特征方面要有力的多,真实的模型(ground truth model)应该是稀疏的,换句话说,只有少部分是特征是非零的。

    基于决策树的特征选择

    决策树能用来计算特征重要性,反过来也可以用于去除不相关特征。

    from sklearn.ensemble import ExtraTreesClassifier

    from sklearn.datasets import load_iris

    from sklearn.feature_selection import SelectFromModel

    iris = load_iris()

    X, y = iris.data, iris.target

    X.shape

    (150,4)

    clf = ExtraTreesClassifier()

    clf = clf.fit(X, y)

    clf.feature_importances_

    array([ 0.04..., 0.05..., 0.4..., 0.4...])

    model = SelectFromModel(clf, prefit=True)

    X_new = model.transform(X)

    X_new.shape

    (150, 2)

    展开全文
  • 基于sklearnLasso实现与效果分析

    千次阅读 2018-05-23 19:54:09
    Lasso回归(也称套索回归),是一种正则化的线性回归。与岭回归相同,使用Lasso也是约束系数,使其...这可以看做是一种自动化的特征选择。 代码实现  同样,将lasso应用在波士顿房价预测上面。完整代码如下: ...
  • # 基于糖尿病的数据集,基于Lasso计算特则的相关系数路径,Lasso中对L1正则项进行优化 # 图示中每一个颜色代表了一个特征值的相关...# 因为L1正则化容易产生稀疏解,也常用来做特征选择 import numpy as np impor...
  • 它在某些情况下是有用的,因为它倾向于选择具有较少非零系数的解,有效地减少了给定解所依赖的特征的数量。因此,Lasso及其变体是压缩感知领域的基础。在一定条件下,可以准确恢复一组非零系数(参见 Compressive ...
  • 这种现象的产生可能是特征值设定的原因,比如性别男性为1女性为0,或者天气晴天为1阴天为0,这种非黑及白的选择如果有很多,可能会产生一溜零的情况。百度百科上面这段话写的特别好,特地摘抄在下面“该方法是一种...
  • sklearnsklearn.feature_selection的SelectFromModel函数的简介、使用方法之详细攻略 ...1、使用SelectFromModel和LassoCV进行特征选择 2、L1-based feature selection 3、Tree-based feature selection Selec...
  • 采用AIC、BIC信息标准的模型选择通常十分迅速,但是依赖于对合适的自由度的评价,并且在大数据量的分析中,往往假定模型是正确的,然而基于数据产生的模型去描述事物通常不准确,存在实际特征大于样本的情况。...
  • sklearn 线性回归

    2021-02-18 09:15:45
    1 多元线性回归LinearRegression原理建模评估指标2 岭回归建模Ridge专门的选择最好alpha的交叉验证3 Lasso 的核心作用:特征选择4 多项式回归多项式回归提升模型表现 1 多元线性回归LinearRegression 原理 线性回归...
  • sklearn和statsmodels 的区别

    千次阅读 2019-08-05 15:30:03
    skleran 常用子模块 : ... 降维 :PCA ,特征选择 ,矩阵分解等。 模型选择 :网格搜索, 交叉验证 ,指标矩阵。 预处理: 特征提取,正态化。 statsmodels常用子模块 回归模型:线性回归 ,通用线性...
  • 文章目录一,函数二,参数说明三,方法四,示例五,使用SelectFromModel和LassoCV选择特征 一,函数 class sklearn.feature_selection.SelectFromModel(estimator, *, threshold=None, prefit=False, norm_order=...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

lassosklearn特征选择