报错:RuntimeWarning: invalid value encountered in double_scalars W = numer / denom
我自查发现代码包含levene和t检验部分,且涉及多步除法。一旦分母为0或NaN就会出现上述报错
在chatgpt帮我过了一遍所有可能的分母时,发现就两种情况:
1-样本数异常(为0或为1——自由度为0),我的数据中没有这种情况;
2-计算t统计量时,分母包含合并方差,一旦为0,也会报错
然后我去翻了一下我的特征矩阵的csv文件,发现确实有几列提取特征出来所有样本(group_0和group_1)的值均为一样,这种特征一方面会导致合并方差为0然后t检验时报错,另一方面这根本无法区分两组,显然不是我们需要的特征。因此在进行levene和ttest前,直接将这种合并方差为0的特征忽略掉即可解决报错
相关代码修改如下:
def t_test_feature_selection(X, y):
y = y.squeeze() # 将 y 转换为 Series
n_samples, n_features = X.shape # 获取X的样本数量n_samples和特征数量n_features
selected_features = [] # 用于存储通过t检验的特征索引
for feature_index in range(n_features):
# 遍历每个特征
feature_data = X[:, feature_index] # 每列特征存储至feature_data
group_0 = feature_data[y == 0] # 根据目标变量y的值,每列特征分为2个group
group_1 = feature_data[y == 1]
# 检查合并方差是否为0
combined_data = np.concatenate([group_0, group_1])
if np.var(combined_data, ddof=1) == 0:
continue # 合并方差为0,跳过该特征
# 进行Levene检验和t检验
if levene(group_0, group_1)[1] > 0.05: # Levene检验方差齐性,p>0.05代表方差齐
if ttest_ind(group_0, group_1)[1] < 0.05: # 独立t检验p<0.05,说明2个group间显著差异
selected_features.append(feature_index)
else:
if ttest_ind(group_0, group_1, equal_var=False)[1] < 0.05: # 方差不齐时,独立t检验要设置equal_var=False
selected_features.append(feature_index)
return selected_features
标签:group,RuntimeWarning,方差,scalars,double,feature,特征,报错,data
From: https://www.cnblogs.com/xjl-ultrasound/p/18343045