首页 > 其他分享 >解决|RuntimeWarning: invalid value encountered in double_scalars W = numer / denom

解决|RuntimeWarning: invalid value encountered in double_scalars W = numer / denom

时间:2024-08-05 13:39:14浏览次数:8  
标签:group RuntimeWarning 方差 scalars double feature 特征 报错 data

报错: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

相关文章