PCA 解决 多重共线性问题

PCA 解决 多重共线性问题

学习链接:link
多重共线性是指自变量彼此相关的一种情况。当你拟合模型并解释结果时,多重共线性可能会导致问题。数据集的变量应该是相互独立的,以避免出现多重共线性问题。

线性回归中,多重共线性识别: 计算每一个自变量的 方差膨胀因子VIF.

我根据链接里,下载了钻石数据集,但是算出来的协方差矩阵有点不一样。根据90%的n_components_,我的结果只保留了一个特征。不知道是不是LabelEncode的时候的顺序不一致导致的问题。
而且这个数据集真正要对类别型变量进行编码的话,应该还要使用到OneHot编码吧。

下面是使用钻石数据集分析的代码,未完成:

# 使用kaggle钻石数据集探索PCA解决多重共线性
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.preprocessing import OneHotEncoder, LabelEncoder, LabelBinarizer, OrdinalEncoder
from sklearn.decomposition import PCA

# 读取数据
diamonds_data = pd.read_csv(r"D:\someDatasetsForML\diamonds.csv", index_col=0)
pd.set_option('display.max_columns', 11)
print(diamonds_data.columns)

# 对分类变量进行编码
# 这里就直接使用LabelEncoder
cols_to_encod = ['cut', 'color', 'clarity']  # 需要编码的列
for col in cols_to_encod:
    diamonds_data[col] = OrdinalEncoder().fit_transform(np.array(diamonds_data[col])[:,np.newaxis])

# 由于price是标签,将它和z列交换一下位置,放到最后一列
data_price = diamonds_data['price']
diamonds_data.drop('price', axis=1, inplace=True)
diamonds_data = pd.concat([diamonds_data, data_price], axis=1)
print(diamonds_data)

# 画出热力图,可视化观察每一个特征的相关性
# 先算出相关系数
corr_df = diamonds_data.corr()
# 设置bool索引mask
mask = np.zeros_like(corr_df, dtype=bool)
mask[np.triu_indices_from(diamonds_data, k=1)] = True
# 画出热力图
plt.figure(figsize=(12, 8), dpi=70)
cmap = sns.diverging_palette(220, 10, as_cmap=True)
sns.heatmap(corr_df, square=True, mask=mask, annot=True, cmap=cmap)
plt.show()
plt.close()
# 从热力图和协方差矩阵可以看出,有些自变量之间存在高度相关性。
# 可以直接删除掉有些相关特征,但是会造成信息的缺失。这里使用PCA降维解决。
pca = PCA(n_components=0.9)
pca.fit(diamonds_data)
print(pca.explained_variance_ratio_)

print(diamonds_data['clarity'].unique())

下面是自己用鸢尾花数据集分析的代码:

# 使用kaggle钻石数据集探索PCA解决多重共线性
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.preprocessing import OneHotEncoder, LabelEncoder, LabelBinarizer, OrdinalEncoder,MinMaxScaler
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from statsmodels.stats.outliers_influence import variance_inflation_factor

iris_data = load_iris()
data = iris_data.data

## 归一化,最大最小值
data = MinMaxScaler().fit_transform(data)

## 计算协方差矩阵,画出热力图
corr_mat = np.corrcoef(data.T)
print(corr_mat)
#
# # 转换成df
# corr_df = pd.DataFrame(corr_mat, columns=iris_data.feature_names, index=iris_data.feature_names)

plt.figure(figsize=(6, 4), dpi=80)
cmap = sns.diverging_palette(220, 10, as_cmap=True)
sns.heatmap(corr_mat, square=True, cmap=cmap, annot=True)
plt.show()

# 计算VIF
vif_list = [variance_inflation_factor(data, i) for i in range(4)]
print("VIF:")
print(vif_list)

# pca
pca = PCA(n_components=2)
data_pca2 = pca.fit_transform(data)
print('variance_ratio_:')
print(pca.explained_variance_ratio_)

# 再次计算VIF
vif_list2 = [variance_inflation_factor(data_pca2, i) for i in range(2)]
print("vif_list2:")
print(vif_list2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值