线性
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
结果: