如何获得更高的逻辑回归模型准确性?

人工智能 回归 音频处理 二元分类 逻辑回归
2021-11-16 04:10:01

我正在使用逻辑回归研究婴儿哭泣检测模型

在......之外581音频,222是婴儿在哭。每个音频都是5秒。

我所做的是将每个音频转换为数字。这些数字进入一个.csv文件。所以首先我拿了100从每个音频中采样,然后1000样品,然后所有110250样本放入一个.csv文件中,每个样本的末尾都有一个数字 1(哭泣)或 0(不哭泣)。.csv然后我使用该文件中的逻辑回归训练模型。

我面临问题是100对每个音频采样64% 的准确率,而 1000 个样本和 110250 个样本(完整数据集)仅达到66% 的准确率如何使用逻辑回归将模型的准确性提高到 80%。

我只能使用简单的逻辑回归,因为我必须在Arduino上部署模型。

1个回答

尝试整改

改进模型可用的功能,删除数据中存在的一些噪声

  • 在音频数据中,一种常见的方法是对数据进行平滑处理,然后对其进行校正,以便随着时间的推移声能的总量更容易区分
# Rectify the audio signal
audio_rectified = audio.apply(np.abs)
  • 您还可以计算每个时间点的绝对值这也称为校正,因为您确保所有时间点都是正的。

  • 通过在50 个样本的窗口rolling中取平均值来平滑数据

audio_rectified_smooth = audio_rectified.rolling(50).mean()
  • 计算每个声音的包络并对其进行平滑处理将消除大部分噪音,从而获得更清晰的信号。

计算频谱图

  • 计算声音的频谱图(即组合窗口傅立叶变换)。这描述了随着时间的推移声音中存在哪些频谱内容(例如,低音和高音)。与原始音频文件相比,频谱图中的信息要多得多。通过计算光谱特征,您可以更好地了解正在发生的事情。

    • 这类似于我们计算滚动平均值的方式:

      • 我们在滑动窗口中计算多个傅里叶变换,以查看它如何随时间变化。对于每个时间点,我们围绕它取一个时间窗口,计算窗口的傅里叶变换,然后滑动到下一个窗口。结果是对傅里叶变换的描述,因为它在整个时间序列中发生变化,称为短时傅里叶变换或 STFT。

        • 选择窗户尺寸形状
        • 在某个时间点,计算该窗口的FFT
        • 将窗口滑动一格
        • 汇总结果
    • 计算 STFT

      • 我们可以计算 STFTlibrosa import librosa as lr
      • 我们可以调整几个参数(例如窗口大小
      • 出于我们的目的,我们将转换为对所有频率的平均值进行归一化的分贝。
      • 然后我们可以用specshow()函数可视化它

这就是计算STFT的方法

# Calculating the STFT
# Import the functions we'll use for the STFT
from librosa.core import stft, amplitude_to_db
from librosa.display import specshow

# Calculate our STFT
HOP_LENGTH = 2**4
SIZE_WINDOW = 2**7
audio_spec = stft(audio, hop_length=HOP_LENGTH, n_fft=SIZE_WINDOW)

# Convert into decibels for visualization
spec_db = amplitude_to_db(audio_spec)

# Visualize
specshow(spec_db, sr=sfreq, x_axis='time', y_axis='hz', hop_length=HOP_LENGTH)

尝试光谱特征工程

您还可以对您的婴儿音频数据执行频谱特征工程

  • 因为每个时间序列都有不同的光谱模式。
  • 我们可以通过分析频谱图来计算这些频谱模式。
  • 例如,光谱带宽光谱质心描述了每个时刻大部分能量的位置。
# Calculate the spectral centroid and bandwidth for the spectrogram
bandwidths = lr.feature.spectral_bandwidth(S=spec)[0]
centroids = lr.feature.spectral_centroid(S=spec)[0]
 
# Display these features on top of the spectrogram
ax = specshow(spec, x_axis='time', y_axis='hz', hop_length=HOP_LENGTH)
ax.plot(times_spec, centroids)
ax.fill_between(times_spec, centroids - bandwidths / 2,centroids + bandwidths / 2, alpha=0.5)

现在您可以组合光谱(spec 光谱数据帧)和分类器中的时间特征

centroids_all = []
bandwidths_all = []
 
for spec in spectrograms:
    bandwidths = lr.feature.spectral_bandwidth(S=lr.db_to_amplitude(spec))
    centroids = lr.feature.spectral_centroid(S=lr.db_to_amplitude(spec))
    # Calculate the mean spectral bandwidth
    bandwidths_all.append(np.mean(bandwidths))
    # Calculate the mean spectral centroid
    centroids_all.append(np.mean(centroids))
# Create our X matrix
X = np.column_stack([means, stds, maxs, tempo_mean, tempo_max, tempo_std, bandwidths_all, centroids_all])

为您的逻辑回归模型

  • 提高准确性的方法之一是优化由 logit 模型生成的预测概率截止分数。
  • 在将所有特征放入机器学习模型之前,您可以将所有特征标准化为相同的比例。
  • 寻找数据中的类别不平衡
  • 您还可以优化其他指标,例如Log LossF1-Score
  • 调整模型的超参数。在 LogisticRegression 的情况下,参数C是一个超参数。