【问题标题】:How to merge binary class Logistic Regression with Python如何将二进制类 Logistic 回归与 Python 合并
【发布时间】:2017-04-09 23:12:38
【问题描述】:

我有一个包含许多分类列的视频游戏数据集。 我对所有这些列进行了二值化。 现在我想用 Logistic 回归预测一个列(称为 Rating),但这个列现在实际上被二值化为 4 列(Rating_Everyone、Rating_Everyone10+、Rating_Teen 和 Rating_Mature)。 所以,我应用了四次逻辑回归,这是我的代码:

df2 = pd.read_csv('../MQPI/docs/Video_Games_Sales_as_at_22_Dec_2016.csv', encoding="utf-8")
y = df2['Rating_Everyone'].values
df2 = df2.drop(['Rating_Everyone'], axis=1)
df2 = df2.drop(['Rating_Everyone10'], axis=1)
df2 = df2.drop(['Rating_Teen'], axis=1)
df2 = df2.drop(['Rating_Mature'], axis=1)
X = df2.values
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.20)

log_reg = LogisticRegression(penalty='l1', dual=False, C=1.0, fit_intercept=False, intercept_scaling=1,
                             class_weight=None, random_state=None, solver='liblinear', max_iter=100,
                             multi_class='ovr',
                             verbose=0, warm_start=False, n_jobs=-1)
log_reg.fit(Xtrain, ytrain)
y_val_l = log_reg.predict(Xtest)
ris = accuracy_score(ytest, y_val_l)

print("Logistic Regression Rating_Everyone accuracy: ", ris)

再说一遍:

y = df2['Rating_Everyone10'].values
df2 = df2.drop(['Rating_Everyone'], axis=1)
df2 = df2.drop(['Rating_Everyone10'], axis=1)
df2 = df2.drop(['Rating_Teen'], axis=1)
df2 = df2.drop(['Rating_Mature'], axis=1)
X = df2.values
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.20)

log_reg = LogisticRegression(penalty='l1', dual=False, C=1.0, fit_intercept=False, intercept_scaling=1,
                             class_weight=None, random_state=None, solver='liblinear', max_iter=100,
                             multi_class='ovr',
                             verbose=0, warm_start=False, n_jobs=-1)
log_reg.fit(Xtrain, ytrain)
y_val_l = log_reg.predict(Xtest)
ris = accuracy_score(ytest, y_val_l)

print("Logistic Regression Rating_Everyone accuracy: ", ris)

Rating_Teen 和 Rating_Mature 以此类推。 您能告诉我如何将所有这四个结果合并为一个结果,或者如何更好地解决这个多类 Logistic 回归问题?

【问题讨论】:

    标签: python machine-learning scikit-learn logistic-regression


    【解决方案1】:

    LogisticRegression 模型天生就是处理多类问题的:

    下面是scikit-learn支持的分类器的总结 按策略分组;你不需要这个类中的元估计器 如果您使用其中之一,除非您想要自定义多类

    行为:固有的多类:朴素贝叶斯、LDA 和 QDA、决策 树,随机森林,最近邻,设置 multi_class=sklearn.linear_model.LogisticRegression 中的“多项式”。

    作为一个基本模型,没有类权重(您可能需要这样做,因为样本可能不会在评级上保持平衡)设置 multi_class='multinomial' 并将求解器更改为 'lbfgs' 或一个 支持多类问题的其他求解器:

    对于多类问题,只有“newton-cg”、“sag”和“lbfgs”句柄 多项损失; “liblinear”仅限于一对一的方案

    因此,您不必按照现有方式拆分数据集。而是提供原始评级列作为标签。

    这是一个最小的例子:

    X = np.random.randn(10, 10)
    y = np.random.randint(1, 4, size=10) # 3 classes simulating ratings
    lg = LogisticRegression(multi_class='multinomial', solver='lbfgs')
    lg.fit(X, y)
    lg.predict(X)
    

    编辑:回复评论。

    td;lr:我希望模型能够自行学习这种交互。如果不是,您可以将该信息编码为特征。所以没有明显需要对你的类进行二值化。

    据我了解,您具有电影的特征,并且您将电影的 MPAA 评级作为标签(您正试图预测)。然后这是一个多类问题,您可以使用逻辑回归开始建模(您知道这一点)。这是我在上面提出的模型。

    现在您认识到类之间存在隐含的距离。我使用这些信息的方式是作为模型的一个特征。但是,我首先倾向于看到模型会自行学习这一点。

    【讨论】:

    • 首先感谢您的回答。我有一点疑问:So you don't have to split your datasets up the way you have. Instead provide the original ratings column as the labels. 如果我这样做,我不提供评级类(E、E10+、T 和 M)之间的隐式链接,其中 E 最接近 E10+,但它远离 M(等等.)?再次感谢
    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 2015-01-18
    • 2015-01-06
    • 2020-09-12
    • 2018-03-23
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多