Python,LinearRegression,缺失值处理

Python 线性回归中LinearRegression样本为零如何单独剔除处理,而不是整行或者整列删除处理

img

AB两列为X1,X2,D列开始每一组都是Y1,Y2,Y3

D1单元格为空,我想实现的是从D2开始进行线性回归,
E1,E2单元格为空,我想实现的是从E3开始进行线性回归,
F1,F2,F3单元格为空,我想实现的是从F4开始进行线性回归。
用dropna处理会把我整行或者整列都删除,fillna我也没法去合理填空

想问下如何添加实现跳过空单元格往下进行仿真。

具体代码如下:

from operator import index
from statistics import mean
from tokenize import PlainToken
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def stdError_func(y_test,y):
    return np.sqrt(np.mean((y_test - y )**2))    #均方根误差

def R2_1_func(y_test,y):
    return 1- ((y_test - y)**2).sum() /( (y.mean()-y)**2).sum() #均方误差的比值

def R2_2_func(y_test,y):
    y_mean = np.array(y)
    y_mean[:]=y.mean()
    return 1 - stdError_func(y_test,y) / stdError_func(y_mean,y)   

from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

df_empty=pd.DataFrame()
filename = "C:/Users/CNFRSUN1/Desktop/data.csv"
df=pd.read_csv(filename,engine='python',header=None)
x= np.array(df.iloc[:,0:3].values) #加载数据1,2,3列数据
for i in range(3, len(df.columns)):
    y= np.array(df.iloc[:,i:i+1].values)   #加载数据第4到最后一列数据
    cft=linear_model.LinearRegression() #导入模型
    print(x.shape)
    cft.fit(x, y) #训练模型
    print("model coefficients",cft.coef_) #函数系数
    print("model intercept",cft.intercept_) #截距

    predict_y = cft.predict(x) #预测数据
    s1_t=cft.coef_.T

    total_parameter = []
    for j in range(0, len(s1_t)):
        total_parameter.append(s1_t[j])
    total_parameter.append(cft.intercept_)
    for k in range(0, len(predict_y)):
        total_parameter.append(predict_y[k])
    df1=pd.DataFrame(total_parameter)

    # output_filename = "C:/Users/CNFRSUN1/Desktop/data11111.csv"
    # df2=pd.read_csv(output_filename,engine='python',header=None)
    # dataframe_ori=pd.DataFrame(df2)
    # if len(dataframe_ori)!=0: 
    #     dataframe_new=pd.concat([dataframe_ori, pd.DataFrame(df1)],axis=1)
    # else:
    #     dataframe_new = pd.DataFrame(df2)
    # dataframe_new.to_csv(output_filename,header=False,index=False)
    df_empty=pd.concat([df_empty,df1],axis=1)

df_empty.insert(0,'','',allow_duplicates=True)
df_empty.insert(0,'','',allow_duplicates=True)
df_empty.insert(0,'','',allow_duplicates=True)
df_empty.columns=range(df_empty.shape[1])
dff=pd.concat([df,df_empty])
dff.to_csv("C:/Users/CNFRSUN1/Desktop/data11111.csv",header=False,index=False)

predict_y = cft.predict(x) #预测数据
strError = stdError_func(predict_y,y)
R2_1 = R2_1_func(predict_y,y)
R2_2 = R2_2_func(predict_y,y)
score = cft.score(x, y)

print('strerror={:.2f},R2_1={:.2f},R2_2={:.2f},clf.score={:.2f}'.format(
    strError,R2_1,R2_2,score))

加在27行后

x = np.array([x[i] for i in range(x.shape[0]) if y[i]])
y = np.array([y[i] for i in range(len(y)) if y[i]])
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:
    # 导入相关库
    import numpy as np
    import pandas as pd
    from sklearn.linear_model import LinearRegression
    
    # 读取数据集并处理缺失值
    data = pd.read_csv('data.csv')
    data = data.replace(0, np.nan)  # 将0替换为nan
    
    # 针对每一组进行线性回归模型训练
    for i in range(1, 4):
        X = data[['X1', 'X2']]  # 自变量
        Y = data['Y{}'.format(i)]  # 因变量
        mask = Y.isnull()  # 找到空值所在的行的索引
        X_train = X[~mask]  # 剔除空值所在的行
        Y_train = Y[~mask]  # 剔除空值所在的行
        model = LinearRegression()
        model.fit(X_train, Y_train)
        print('Y{} = {}*X1 + {}*X2 + {}'.format(i, model.coef_[0], model.coef_[1], model.intercept_))
    

    解释:

    首先,导入必要的库,包括 numpypandassklearn.linear_model。然后,读取数据集并将其中的 0 值替换为 nan,以方便后续剔除操作。接着,使用 for 循环针对每一列的因变量进行线性回归模型训练。

    在每次迭代中,首先,选取自变量和因变量。然后,使用 isnull() 方法找到因变量中为 nan 的那些值所在的行的索引。接着,使用“反向掩码”将空值所在的行抠掉,得到训练数据集。最后,使用 LinearRegression() 模型进行训练,并输出模型的参数。

    需要注意的是,此处的 ~ 符号是取反运算,即 ~mask 的布尔值为 False 的位置就是中间没有空值的位置。

    这样,就可以针对样本中出现零值的情况进行单独剔除处理,而不用整行或是整列删除。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^