导入数据
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
import pandas as pd
from sklearn.feature_selection import SelectKBest,RFE,SelectFromModel
import seaborn as sns
import numpy as np
data = pd.read_csv('H:/Myjupyter/zhw/血糖/2023.12.06/餐后+糖耐10.06.csv')
pre_data = pd.read_csv('H:/Myjupyter/zhw/血糖/2023.12.06/餐后+糖耐预测.csv')
#将训练数据与预测数据合并,便于一起处理
full = data.append(pre_data,ignore_index = True)
# full.describe()
# full.info()
# #特征与标签关系
# sns.barplot(data = data,x='',y = 'gl')
x = data.drop(['name','bsTemp','glucose'],axis=1)
y = data['glucose']
df = pd.DataFrame(data)
删除低方差(超过90%)的特征
低方差:假设有两个特征,1)性别只包含一个性别值(例如,女性),2)年龄包含30到50岁之间的不同值。在这种情况下,性别特征的方差很小,因为这个属性中的值都是相同的,在模型训练时,它不会帮助模型找到任何模式;因此我们可以直接删除这个特征。
from sklearn.feature_selection import VarianceThreshold
# 创建VarianceThreshold对象,设定方差阈值
threshold = 0.9
selector = VarianceThreshold(threshold)
y = y.reshape(-1, 1)
# 应用特征选择器到数据集
selected_features = selector.fit_transform(y)
# 获取删除的特征索引
removed_indices = selector.get_support(indices=True)
# 获取删除的特征标签
removed_feature_labels = [data.columns[i] for i in removed_indices]
# 删除低方差特征
data_filtered = data.drop(columns=removed_feature_labels)
# 输出删除低方差特征后的数据集和删除的特征标签
# print("删除低方差特征后的数据集:")
# print(data_filtered)
print("删除的特征标签:")
print(removed_feature_labels)
此处参考该博客:https://blog.youkuaiyun.com/deephub/article/details/127961399
进行皮尔逊相关系数分析
import numpy as np
corr_matrix = x.corrwith(y)
# 排序相关系数
sorted_corr = corr_matrix.abs().sort_values(ascending=False)
sorted_corr_list = sorted_corr.tolist()
#print(sorted_corr_list)
# # 提取特征值和特征标签
# selected_feature_values = x[sorted_corr.index]
# selected_feature_labels = sorted_corr.index.tolist()
# print("\n选择的特征标签:")
# print(selected_feature_labels)
# # 打印相关系数
# print("特征与目标变量的相关系数:")
# print(sorted_corr.head(50))
# 选择相关系数大于阈值的特征
threshold = 0.55
selected_features = sorted_corr[sorted_corr > threshold].index.tolist()
# 打印选择的特征
print("\n选择的特征:")
print(selected_features)
# 提取选择的特征值和特征标签
selected_sorted_corr = sorted_corr.loc[selected_features].values
selected_feature_labels = sorted_corr.loc[selected_features].index.tolist()
# 按特征值从大到小排列
sorted_indices = selected_sorted_corr.argsort()[::-1]
sorted_sorted_corr = selected_sorted_corr[sorted_indices]
sorted_feature_labels = [selected_feature_labels[i] for i in sorted_indices]
# 输出选择的特征值和特征标签
print("选择的特征值(按从大到小排列):\n", sorted_sorted_corr[:20])
print("选择的特征标签(按从大到小排列):\n", selected_feature_labels[:20])
phik
Phik(Φk
)是一种用于衡量两个分类变量之间关联性的统计指标。它是基于Phi系数(ϕ)和熵(entropy)的衍生指标,可以用于度量分类变量之间的非线性相关性。
Phik的取值范围在0到1之间,其中0表示无关联,1表示完全相关。与其他常见的相关性指标(如皮尔逊相关系数)相比,Phik能够捕捉到非线性和非单调关系。
Phik的计算基于熵的概念,它衡量了变量之间的不确定性或信息量。具体计算公式如下:
Φk = √(χ2 / (n * min(k-1, m-1)))
其中,χ2是卡方统计量,n是样本大小,k和m分别是两个分类变量的不同取值数量。
Phik可以应用于不同类型的分类变量,包括二元变量和多元变量。它可以用于探索变量之间的关系,进行特征选择和特征工程,以及在机器学习任务中进行特征重要性评估。
import phik
df_new1_epoch_time = data.copy()
interval_columns = data.drop(['glucose','name'],axis=1)
phik_correlations = []
phik_significances = []
columns = interval_columns.columns
y = df_new1_epoch_time['glucose']
for c in columns:
x = df_new1_epoch_time[c]
if c in interval_columns:
phik_correlations.append(phik.phik_from_array(x, y, [c]))
phik_significances.append(phik.significance.significance_from_array(x, y, [c])[0])
len(phik_significances)
phik_df = pd.DataFrame({'phik': phik_correlations, 'p-value': phik_significances}, index=columns)
phik_df.sort_values(by='p-value', ascending=True, inplace=True)
phik_df.head(20)