尝试整改
改进模型可用的功能,删除数据中存在的一些噪声。
- 在音频数据中,一种常见的方法是对数据进行平滑处理,然后对其进行校正,以便随着时间的推移声能的总量更容易区分。
# Rectify the audio signal
audio_rectified = audio.apply(np.abs)
audio_rectified_smooth = audio_rectified.rolling(50).mean()
- 计算每个声音的包络并对其进行平滑处理将消除大部分噪音,从而获得更清晰的信号。
计算频谱图
这就是计算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 Loss和F1-Score。
- 调整模型的超参数。在 LogisticRegression 的情况下,参数C是一个超参数。