Как разделить точечные диаграммы, используя границу решения? - PullRequest
0 голосов
/ 08 января 2020

В настоящее время я работаю над этим набором данных, который относится к лучшим песням хитов на Spotify с 2010 по 2019 год, и я использую Logisti c Регрессия для работы над отношениями между речевостью песен (зависимой) и длительность и валентность соответственно (независимо). У меня возникают проблемы с попыткой преобразовать числовые значения речевости песен в двоичные значения для классификации, так как я использую регрессию logisti c. Кроме того, я не знаю, как разделить диаграммы рассеяния с границей решения. Буду очень признателен, если кто-нибудь сможет мне помочь с этим.

%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')

def LogReg0732():
    Dur = df.dur
    Dur = np.array(Dur)
    Dance = df.dnce
    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
    Dance = np.array(Dance)
    Pop = df.popu
    Pop = np.array(Pop)

    Speech = (Speech < 8).astype(int) 

    Speech = np.array(Speech)

    X = Dur

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

    y = Speech

    clf = LogisticRegression().fit(X.T, y)
    print("Coef ", clf.intercept_, clf.coef_)
    xx, yy = np.mgrid[np.min(Dur):np.max(Dur), np.min(Valence):np.max(Valence)]
    gridxy = np.c_[xx.ravel(), yy.ravel()]
    probs = clf.predict_proba(gridxy)[:,1].reshape(xx.shape)
    f, ax = plt.subplots(figsize=(10,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('Duration')
    plt.ylabel('Valence')
    plt.savefig('LR1.svg')
    plt.show()

LogReg0732()

Мой текущий график

Тип графика, которого я хочу достичь

Мой набор данных

1 Ответ

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

Причина, по которой ваш график выглядит не так, как вы бы его sh выглядела, заключается в том, что используемый вами алгоритм регрессии не может классифицировать «речевую речь» как ту или иную, истинную или ложную, одну или ноль , Ваш код в порядке. Хотя ваш график выглядит не так, как вам хотелось бы, он выглядит так, как должен выглядеть - график является точным представлением данных. Причина, по которой данные плохо разбираются на категории, заключается в том, что категории не находятся в данных в первую очередь.

Я думаю, что вам, возможно, придется пересмотреть исходную посылку. «Речь», если это вообще что-то, представляется числовым значением. Если это числовое значение, то ваша проблема - это проблема регрессии, а не проблема классификации.

Я почти ничего не знаю о "речевости", но быстрый Google предполагает, что он не совсем в той же лиге, что и длина, ширина и высота в отношении измеримых компонентов материальной реальности. Я был бы обеспокоен тем, что «речевой» может быть меньше, чем кажется на первый взгляд, и вряд ли это будет чем-то достойным научного изучения.

...