Python 线性回归中LinearRegression样本为零如何单独剔除处理,而不是整行或者整列删除处理
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]])
不知道你这个问题是否已经解决, 如果还没有解决的话:# 导入相关库
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_))
解释:
首先,导入必要的库,包括 numpy
、pandas
和 sklearn.linear_model
。然后,读取数据集并将其中的 0
值替换为 nan
,以方便后续剔除操作。接着,使用 for 循环针对每一列的因变量进行线性回归模型训练。
在每次迭代中,首先,选取自变量和因变量。然后,使用 isnull()
方法找到因变量中为 nan
的那些值所在的行的索引。接着,使用“反向掩码”将空值所在的行抠掉,得到训练数据集。最后,使用 LinearRegression()
模型进行训练,并输出模型的参数。
需要注意的是,此处的 ~
符号是取反运算,即 ~mask
的布尔值为 False
的位置就是中间没有空值的位置。
这样,就可以针对样本中出现零值的情况进行单独剔除处理,而不用整行或是整列删除。