【问题标题】:Linear regression analysis with categorical feature具有分类特征的线性回归分析
【发布时间】:2020-05-27 14:25:33
【问题描述】:

回归算法可以很好地表示为数字。很清楚如何对包含数字的数据进行回归并预测输出。但是我需要对包含分类特征的数据进行回归分析。我有一个 csv 文件,其中包含两列 install-id 和 page-name 都是对象类型。我需要将 install-id 作为输入,而 page-name 应该被预测为输出。下面是我的代码。请帮帮我。

import pandas as pd
data = pd.read_csv("/Users/kashifjilani/Downloads/csv/newjsoncontent.csv")
X = data["install-id"]
Y = data["endPoint"]
X = pd.get_dummies(data=X, drop_first=True)
from sklearn import linear_model
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = .20, random_state = 40)
regr = linear_model.LinearRegression()
regr.fit(X_train, Y_train)
predicted = regr.predict(X_test)

【问题讨论】:

    标签: python regression linear-regression


    【解决方案1】:

    我认为在这里我们必须记住回归模型的假设。因为我们试图预测/识别自变量(X)和因变量(y)之间的趋势。 - 线性可分离 - 自变量具有受限的多重共线性。 - 同方差性

    正如您的示例中给出的,您只有一个自变量,并且总结 X 和 y 之间的趋势都应该是线性的。

    假设你给了一个任务来预测旅行的总旅行时间。并且您的数据集具有以下变量 IV - Miles Traveled、NoOfDeliveries、GasPrice 和 City DV - 旅行时间

    在这里您可以看到它是数值(行驶里程,GasPrice)+ 分类变量(NoOfDeliveries,城市)的混合。现在您必须将这些分类变量编码为数字(以便进行回归分析)并预测输出。

    为了将分类变量编码为二进制格式,我们在这里使用 sklearn 库中的 2 个对象 - LabelEncoder 和 OneHotEncoder。

    请点击以下链接了解更多关于如何处理 Categorical variables

    请点击以下链接了解更多关于Dummy variable Trap的信息

    请找到以下链接以了解有关构建简单Linear regression model的更多信息

    【讨论】:

      【解决方案2】:

      对于演示,假设您有这个数据框,其中 IQGender 是输入特征。目标变量是Test Score

      |   Student |   IQ | Gender   |   Test Score |
      |----------:|-----:|:---------|-------------:|
      |         1 |  125 | Male     |           93 |
      |         2 |  120 | Female   |           86 |
      |         3 |  115 | Male     |           96 |
      |         4 |  110 | Female   |           81 |
      |         5 |  105 | Male     |           92 |
      |         6 |  100 | Female   |           75 |
      |         7 |   95 | Male     |           84 |
      |         8 |   90 | Female   |           77 |
      |         9 |   85 | Male     |           73 |
      |        10 |   80 | Female   |           74 |
      

      这里,IQ 是数字,Gender 是分类特征。在预处理步骤中,我们将在数值上应用简单的 imputer,在分类特征上应用 one-hot-encoder。您可以为此使用sklearn's PipelineColumnTransformer 功能。然后,您可以使用您选择的模型轻松地进行训练和预测。

      import pandas as pd
      from sklearn.compose import ColumnTransformer
      from sklearn.model_selection import train_test_split
      from sklearn.pipeline import Pipeline
      from sklearn.preprocessing import OneHotEncoder
      from sklearn.impute import SimpleImputer
      from sklearn import linear_model
      
      # defining the data
      d = {
          "Student": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
          "IQ": [125, 120, 115, 110, 105, 100, 95, 90, 85, 80,],
          "Gender": [
              "Male",
              "Female",
              "Male",
              "Female",
              "Male",
              "Female",
              "Male",
              "Female",
              "Male",
              "Female",
          ],
          "Test Score": [93, 86, 96, 81, 92, 75, 84, 77, 73, 74],
      }
      
      # converting into pandas dataframe
      df = pd.DataFrame(d)
      
      # setting the student id as index to keep track
      df = df.set_index("Student")
      
      # column transformation
      categorical_columns = ["Gender"]
      numerical_columns = ["IQ"]
      
      # determine X
      X = df[categorical_columns + numerical_columns]
      y = df["Test Score"]
      
      # train test split
      X_train, X_test, y_train, y_test = train_test_split(
          X, y, random_state=42, test_size=0.3
      )
      
      # categorical pipeline
      categorical_pipe = Pipeline([("onehot", OneHotEncoder(handle_unknown="ignore"))])
      
      # numerical pipeline
      numerical_pipe = Pipeline([("imputer", SimpleImputer(strategy="mean")),])
      
      # aggregating both the pipeline
      preprocessing = ColumnTransformer(
          [
              ("cat", categorical_pipe, categorical_columns),
              ("num", numerical_pipe, numerical_columns),
          ]
      )
      
      
      rf = Pipeline(
          [("preprocess", preprocessing), ("classifier", linear_model.LinearRegression())]
      )
      
      # train
      rf.fit(X_train, y_train)
      
      # predict
      predict = rf.predict(X_test)
      

      这表明,

      >> array([84.48275862, 84.55172414, 79.13793103])
      

      【讨论】:

      • 感谢您的快速回答,但是我有一个 csv 文件,其中包含名为 install-id 和 page-name 的两列。 Install-id 类似于 Alphanumeric 字段,而 pagename 是字符串。 install-id 和 pagename 都是对象类型。我使用以前的模型进行回归,但它仅适用于数字字段输出。我需要创建模型,我可以在其中输入 install-id 并为此返回页面名称。
      猜你喜欢
      • 2016-03-04
      • 2019-04-07
      • 2018-01-02
      • 2020-08-08
      • 2021-05-14
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多