我目前正在处理该数据集,该数据集与2010年至2019年Spotify上的热门歌曲相关,并且我正在使用Logistic回归研究歌曲的语音(依存性)与持续时间和效价之间的关系分别(独立)。我在使用逻辑回归时尝试将歌曲的语音性数值转换为用于分类的二进制值时遇到了麻烦。另外,我不知道如何用决策边界分离散布图。如果有人可以帮助我,将不胜感激。
%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()
答案 0 :(得分:0)
图形看起来不像您希望的样子的原因是因为您使用的回归算法无法将“语音”分类为真或假,一或零。您的代码很好。虽然您的图形看起来不像您希望的样子,但它的确应有其应有的外观–图形是数据的准确表示。数据不能很好地按类别进行解析的原因是,类别首先不在数据中。
我认为您可能需要重新考虑您的最初前提。 “言语”(如果有的话)似乎是一个数值。如果是数字值,那么您的问题就是回归问题,而不是分类问题。
我对“语音”几乎一无所知,但是一个快速的Google认为,就物质现实的可衡量成分而言,它与长度,宽度和高度并不完全相同。我担心的是,“语音”可能比眼神要少,而且不太可能值得科学研究。