Почему все различные точки рассеяния собраны близко в одной и той же области на графике регрессии logisti c? - PullRequest
1 голос
/ 06 января 2020

В настоящее время я работаю над проектом, в котором моя команда и я должны выбрать набор данных и применить к нему некоторые методы машинного обучения (SLR, MLR et c.), Поэтому для меня я делаю логическую регрессию. Мой набор данных связан с самыми популярными песнями на Spotify 2010-2019, и я хочу посмотреть, как продолжительность и танцевальность песни влияют на ее популярность. Учитывая, что значения популярности являются числовыми, я преобразовал значение популярности каждой песни в двоичные значения. Следовательно, значение популярности песни изменится на «0», если оно ниже 65, и «1», если оно выше значения 65. Затем я решил построить график регрессии 2d logisti c для двух измерений. Конечный результат состоит в том, что оба значения «0» и «1» собраны в одной и той же области, где они должны быть отделены друг от друга, и должна быть граница принятия решения при показе .5. Я просто хочу знать, что это говорит о связи между популярностью песен и их продолжительностью и танцевальностью соответственно. Это должно быть нормально или я ошибся?

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd
from sklearn.linear_model import LogisticRegression 

df = pd.read_csv('top10s [SubtitleTools.com] (2).csv')

BPM = df.bpm
BPM = np.array(BPM)
Energy = df.nrgy
Energy = np.array(Energy)
dB = df.dB
dB = np.array(dB)
Live = df.live
Live = np.array(Live)
Valence = df.val
Valence = np.array(Valence)
Acous = df.acous
Acous = np.array(Acous)
Speech = df.spch
Speech = np.array(Speech)

def LogReg0732():
    Dur = df.dur
    Dur = np.array(Dur)
    Dance = df.dnce
    Dance = np.array(Dance)
    Pop = df.popu

    df.loc[df['popu'] <= 65, 'popu'] = 0

    df.loc[df['popu'] > 65, 'popu'] = 1

    Pop = np.array(Pop)

    X = Dur

    X = np.stack((X, Dance))

    y = Pop

    clf = LogisticRegression().fit(X.T, y)
    print("Coef ", clf.intercept_, clf.coef_)
    xx, yy = np.mgrid[np.min(Dur):np.max(Dur), np.min(Dance):np.max(Dance)]
    gridxy = np.c_[xx.ravel(), yy.ravel()]
    probs = clf.predict_proba(gridxy)[:,1].reshape(xx.shape)
    f, ax = plt.subplots(figsize=(20,8))
    contour = ax.contourf(xx, yy, probs, 25, cmap="BrBG", vmin=0, vmax=1)
    ax_c = f.colorbar(contour)
    ax_c.set_ticks([0, 1/4, 1/2, 3/4, 1])
    idx = np.where(y==1); idx = np.reshape(idx,np.shape(idx)[1])
    y1 = X[:,idx]
    idx = np.where(y==0); idx = np.reshape(idx,np.shape(idx)[1])
    y0 = X[:,idx]
    ax.scatter(y1[0,:], y1[1,:], c='green')
    ax.scatter(y0[0,:], y0[1,:], c='blue')
    plt.xlabel('Danceability')
    plt.ylabel('Duration')
    plt.savefig('LR1.svg')
    plt.show()

LogReg0732()

My current graph

Example of type of graph I'm expecting

My dataset

1 Ответ

0 голосов
/ 07 января 2020

Таким образом, основная причина, если допустить, что в процессе построения модели нет ошибок, заключается в том, что долговечность и способность к потере устойчивости не являются хорошими характеристиками для вашей проблемы. Скорее всего, вам придется добавить больше функций .

Чтобы понять модель в деталях, вам нужно будет выполнить различные статистические тесты, но я думаю, что все они приведут к одному и тому же ответу, что это не очень подходит.

1) Если вы не хотите добавлять дополнительные функции, вы также можете попробовать изменить значение Cutoff с 65 на другое значение, это может помочь.

2) Попробуйте нормализовать ваши данные.

...