机器学习——特征选择总结

线性

Pearson相关分析(或称为高相关滤波法)

def Pearson_reduction(X):
    '''通过Pearson相关性分析,对相关性>0.9的两两变量进行归类,
    在一组相关的变量中,选取代表元,从而达到降维目的
    Param
    ================
    X: 没有缺失值、异常值的dataframe
    return:
    X_del: 经过Pearson分析后降维的数据
    ================
    '''

    # step1: 计算自变量之间的pearson相关系数
    X_corr = X.corr()


    # step2: 除主对角线外,将两两高度正相关的各组变量取出来
    X_corr1 = []
    for i in X_corr:              
        for j in X_corr:
            # 跳过主对角线上的元素
            if i == j:
                continue
            # 若一组变量高度线性正相关(即相关系数大于0.9),则将添加到X_corr1中
            if X_corr[i][j] > 0.9:
                ax = set((i,j))   # 将对应的行名和列名取出来
                # print(ax)
                X_corr1.append(ax)  # 两两正相关的变量名组成的列表
    print("两两正相关的变量:")  
    for i in range(len(X_corr1)):
        print(X_corr1[i])


    # step3: 遍历所有字符串,将存在相关性的字符串分别归类
    class_st = []  
    X_corr2 = X_corr1.copy()  # 创建数据X_corr1的副本,否则后续原始数据df_corr1会被删除
    # while循环目的:归类,得到结果:class_st
    while len(X_corr2) > 0:     # 若X_corr2的长度等于0,说明已经把X_corr2中所有的元素归好类
        x, y = list(X_corr2)[0]   # 取出X_corr2中任意一个集合,并将集合里面的两个元素赋值到x,y
        is_exist = True      # 判断是否为新的类
        
        # 判断{x,y}所属的类别
        # 方法:若x或y中有一个属于某一类,则另外一个也属于这一类,可将另外一个并入到这一类中
        for i in range(len(class_st)):
             if x in class_st[i] or y in class_st[i]:
                    class_st[i] = class_st[i] | {x, y}  
                    is_exist = False   # 可判断此时x,y不属于新的类
                    break   # 若已经找到x,y所属的类别,不再遍历class_st后面的类别,提高效率
                    
        # 判断{x,y}是否是新的类,若是,则创建新的类,并将此新的类添加到class_st中
        if is_exist:
            new_class = {x, y}
            class_st.append(new_class)
            
        del X_corr2[0] # 将data[0](即x,y)归好类后删除,目的:df_corr2中的所有元素归好类后终止while循环
    print("各组高度线性相关的变量:")
    for i in range(len(class_st)):
        print(class_st[i])


    # step4: 根据class_st的结果,选取一个代表元,筛掉其余变量
    str_del = []   # 要删除的的列名
    for i in range(len(class_st)):
        col_delete = list(class_st[i])[1:]
        str_del.extend(col_delete)  # 将列表col_delete的元素加到列表str_del
    print("要删除的的列名:", str_del)


    # step5: 删除对应的列
    X_red = X.drop(str_del, axis = 1)

    return X_red

Lasso回归(或称为压缩系数法)

比起岭回归,Lasso所带的L1正则项对于系数的惩罚要重得多,并且它会将系数压缩至0,因此可以被用来做特征选择。
Lasso降维原理https://blog.csdn.net/gracejpw/article/details/102496802

# --------------------------step1:选择最佳α ---------------------------------------------

# ======== LassoCV回归 ========
# 使用lassoCV选择最佳α

y = MOR
# LASSO回归模型的交叉验证:使用lassoCV选择最佳α
model = LassoCV(cv = 5)  # LassoCV自动调节alpha可以实现选择最佳的alpha;五折交叉验证
model.fit(X, y)   # 线性回归建模
print('系数矩阵:\n',model.coef_)
print("截距:{}".format(model.intercept_))      # Lasso线性模型截距
print('线性回归模型:\n',model)
print('最佳的alpha:',model.alpha_)  # 只有在使用LassoCV、LassoLarsCV时才有效
# 使用模型预测
predicted = model.predict(X)

# 绘制散点图 参数:x横轴 y纵轴
plt.plot(y,label = '真实值')
plt.plot(predicted, label = '预测值')

# 绘制x轴和y轴坐标
plt.xlabel("时间")
plt.ylabel("能见度MOR")

# 设置刻度间隔
x = ticker.MultipleLocator(800)    # x轴每800一个刻度
# y = ticker.MultipleLocator(15)    # y轴每15一个刻度
ax = plt.gca()
ax.xaxis.set_major_locator(x)
# ax.yaxis.set_major_locator(y)

plt.legend()  #增加图例
plt.title("能见度的真实值与Lasso模型的最佳α参数下的预测值的折线图")
plt.show()  # 显示图形

结果输出:

在这里插入图片描述

# --------------------------step2:搭建训练Lasso线性回归模型  -----------------------------
# 8:2划分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,MOR, test_size=0.2, random_state=31)
print(X_train.shape)  # m×n维,原始数据有n个特征

# LASSO回归模型的交叉验证
# lasso = LassoCV(alpha = 0.1, normalize=True, cv = 10, max_iter=10000)
# lasso.fit(X_train,y_train)

# 搭建并训练Lasso线性回归模型
lasso = Lasso(alpha = 997.1366788046781)     # 默认alpha =1 
lasso.fit(X_train,y_train)

#===============================结果输出:=======================================
print("lasso.coef_:{}".format(lasso.coef_))        # 每个特征的系数
print("lasso.intercept_:{}".format(lasso.intercept_))      # Lasso线性模型截距

# Lasso模型中使用的特征数量
coeff_used_num = np.sum(lasso.coef_ != 0)
print ("number of features used: ", coeff_used_num)

# Lasso特征选择
a = pd.DataFrame(index = X.columns)
a['相关系数'] = lasso.coef_
a_sort = a.sort_values('相关系数', ascending = True)    # 降序
a_sort
coeff_del = a[a['相关系数'] == 0].index     # lasso模型中使用的特征
coeff_used = a[a['相关系数'] != 0].index    # 被剔除的特征
print("lasso模型中使用的特征:", list(coeff_used))
print("lasso模型中被剔除的特征:", list(coeff_del))

# 训练集以及测试集得分
train_score = lasso.score(X_train,y_train)
test_score = lasso.score(X_test,y_test)
print("Traing set score: {:.2f}".format(train_score))   # 训练集得分保留到小数点后两位
print("Test set score:{:.2f}".format(test_score))       # 测试集得分保留到小数点后两位

结果输出:
在这里插入图片描述

非线性

低方差滤波法

import numpy as ny
import pandas as pd
var = df.var()  # 计算df数据框中每一列的方差

variable_del = []   # 创建空列表

# 找出低方差的列名
for i in range(len(var)):
    if var[i] <= 0.001:   # 将阈值设置为0.001
       variable_del.append(var.index[i])  # 将方差低于阈值的列名添加到列表中
print("低方差的特征个数:", len(variable_del), "低方差的特征名:", variable_del)

# 删除低方差的列名,即数据波动较小的列
df_low_var = df.drop(variable_del, axis=1)

随机森林特征重要排序

利用随机森林对特征重要性进行评估https://blog.csdn.net/zjuPeco/article/details/77371645

灰色关联分析

根据因素之间发展态势的相似或相异程度来衡量因素间关联的程度,它揭示了事物动态关联的特征与程度。
Python实现 灰色关联分析 与结果可视化
灰色关联分析(GRA)的理论及应用(matlab和python)

def gray_association_analysis(x):
    '''灰色关联分析
    Param:
    ============
    x:dataframe,第一列是因变量,第二列到最后一列是自变量
    return:
    result:dataframe,各个自变量和因变量的关联程度
    '''

    x = x.T    # 转置

    # 1、数据均值化处理
    x_mean=x.mean(axis=1)  # 求每一行的均值
    # 遍历每一行,对每一行的每个数据除以该行的均值
    for i in range(x.index.size):  
        x.iloc[i,:] = x.iloc[i,:]/x_mean[i]

    # 2、提取参考队列和比较队列
    ck = x.iloc[0,:]   # 参考队列(因变量y)
    cp = x.iloc[1:,:]  # 比较队列(自变量xi)


    # 比较队列与参考队列相减
    t=pd.DataFrame()
    # 按行遍历
    for j in range(cp.index.size):
        temp=pd.Series(cp.iloc[j,:]-ck)
        t=t.append(temp,ignore_index=True)

    # 修改行索引
    t_index = cp.index
    t.index = t_index

    #求最大差和最小差
    mmax=t.abs().max().max()
    mmin=t.abs().min().min()
    rho=0.5

    #3、求关联系数
    ksi=((mmin + rho * mmax)/(abs(t) + rho * mmax))

    #4、求关联度
    r = ksi.sum(axis=1)/ksi.columns.size

    #5、关联度排序,得到结果
    result=r.sort_values(ascending=False)
    return result

gray = gray_association_analysis(df.iloc[:,1:])
gray

结果:

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值