血糖预测工作记录

导入数据

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.csdn.net/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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值