线性回归 - 如何预测两个变量

时间:2021-04-02 09:47:53

标签: python pandas linear-regression

我尝试使用虚拟变量(flv1、h264、mpeg4)来预测(umem 和 utime)。关于如何基于单个分类变量预测两个结果的任何建议?

Dataset

这是我目前所做的。每当我尝试运行 fit 函数时,python 只会返回没有属性的 LinearRegression()。

Progress so far

3 个答案:

答案 0 :(得分:0)

我不确定你能不能做到。

让我们看看列 ["flv1", "h264", "mpeg4"]。它们是由单个分类变量构建的,这意味着这三列中的值只有 3 种可能性:(1, 0, 0), (0, 1, 0), (0, 0, 1),但是有“umem”和“utime”有 4890 个不同的值。 例如,查看索引为 0、3、4887 的行 --> 在所有情况下,flv1 = 0、h264 = 1、mpeg4 = 0,但“umem”和“utime”的值明显不同。

对于初学者来说,您可以为分类变量的每个值计算“umem”和“utime”变量的均值/标准/分布。换句话说,我将从原始数据帧(基于 ladt 三列中的值)创建三个数据帧,并分别分析它们,以查看“umem”和“utime”的值如何为分类的每个值分布变量)。

希望这是有道理的。

答案 1 :(得分:0)

首先,您调用了线性回归的 fit() 方法,但为了预测,您需要在 predict() 之后调用 fit() 方法。

其次,您想要预测多个结果,线性回归适用于预测单个结果。 您应该从 scikit-lear 中查看多类和多输出算法,其中包含 一些 multioutput-regression 算法。

答案 2 :(得分:0)

“编解码器”是您要用作参考以预测“umem”和“utime”的数据列吗?如果是这样,您需要一个管道。

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

std_scaler = StandardScaler() 
lin_reg = LinearRegression()
lin_regressor = Pipeline([
    ("std_scaler", std_scaler),
    ("lin_reg", lin_reg),
])

X = df[['umem', 'utime']]
y_train_predict = df['codec']

def learning_curves(regressor, X, y): 
    
    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=55) 
                                                                                            
    train_errors, val_errors = [], []
    
    for m in range(2, len(X_train)):
        regressor.fit(X_train[:m], y_train[:m])
        y_train_predict = regressor.predict(X_train[:m])
        y_val_predict = regressor.predict(X_val)
        train_errors.append(mean_squared_error(y_train[:m], y_train_predict))
        val_errors.append(mean_squared_error(y_val, y_val_predict))
    
    # this part is just for the plot setting
    plt.figure(figsize=(12,9))
    plt.plot(np.sqrt(train_errors), "r-", linewidth=2, label="train")
    plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")
    plt.legend(loc="upper right", fontsize=14)   
    plt.xlabel("Training set size", fontsize=14) 
    plt.ylabel("RMSE", fontsize=14)              
    plt.axis([0, 60, 0, 20]) 
    plt.show() 
    
    print(np.sqrt(train_errors)[-1], np.sqrt(val_errors)[-1])
    return X_train, y_train

X_train, y_train = learning_curves(lin_regressor, X, y_train_predict)

在这种情况下,您将“umem”和“utime”中的数据与“codec”进行比较。您不需要将“编解码器”转换为虚拟变量。

相关问题