python机器学习—语音性别识别代码详解(调参,预测)

随声附和 提交于 2020-01-07 03:15:40

本人机器学习的一个小作业,挺简单的。希望可以帮到一些入门的小伙伴,当个练手啦!
项目介绍,根据给定的特征来预测是女生还是男生
模型选择的是随机森林,训练集上准确率百分之百,验证集上百分之97.9。
代码分为训练模型(调参和训练)和使用模型进行预测,训练好模型后对新的数据进行的预测,并将预测的结果保存在了result.txt文件中。
软件:anaconda3—jupyter Notebook
用到的数据集 链接: https://pan.baidu.com/s/10LoGDcHDCnjNz4PQpli_Gg
提取码: s3eh

一.数据集介绍

首先介绍一下我所使用的数据集:
每条数据可视作一个长度为21的一维数组。
其中前20个数值是这条语音的20个特征值,这些特征值包括了语音信号的长度、基频、标准差等;最后一个数值是性别标记。用0表示男性、1表示女性。(如下图所示)
train.csv训练集2300条(用于模型训练,有标签)
在这里插入图片描述
test.csv测试集包含 800条(无标签)

在这里插入图片描述

二.代码

模型参数选择

随机森林的基评估器是决策树,单棵决策树的准确率越高,随机森林的准确 率也会越高,因为装袋法是依赖于平均值或者少数服从多数的原则来决定集成结 果的。但决策树很容易过拟合。所以根据参数对模型的影响大小,进行调参。
(1)调参,决策树个数的选取(画学习曲线)
在这里插入图片描述
结果
在这里插入图片描述
根据上面的结果缩小决策树个数的范围,继续调参
在这里插入图片描述
在这里插入图片描述
根据上述结果可以看出,n_estimators 越大,模型的效果往往越好。但 n_estimators 达到一定程度之后,随机森林的精确性往往不在上升或者开始波 动,并且 n_estimators 越大,需要的计算量和内存也越大,训练的时间也越长。 所以最终 n_estimators 选择 110。
(2)调参 max_depth(画学习曲线)
在这里插入图片描述
在这里插入图片描述
从输出的准确率可以看出,当限制树高后,准确率下降,整体的泛化误差上升, 说明此时,提高模型准确率的方法,只能是对 max_features 进行调整。因为 max_depth,min_samples_leaf 以及 min_sample_split 均为剪枝参数,是减小复 杂度的参数。而此时我们需要增加模型的复杂度。max_features 既可以让模型 复杂,也可以让模型简单。
(3)对 max_features 进行调整
在这里插入图片描述
在这里插入图片描述
(四)模型建立
根据上面的参数来建立模型

import pandas as pd
df = pd.read_csv('C:/sound/train.csv') #训练集(有标签)
df1 = pd.read_csv('C:/sound/test.csv') #测试集(无标签)
#print(df1.shape)
from sklearn.model_selection import train_test_split
#数据划分
y=df.ix[:,-1] #将标签列置于此
x=df.ix[:,:-1] #删除标签列
#print(x.shape)
xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3,random_state=100) #划分训练集和验证集(random_state的数据随便写,但必须得写)
#print('y',y.shape)
#print('x',x.shape)
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(n_estimators=110,max_features=3,random_state=0)#决策树的个数110个
rf.fit(xtrain,ytrain) #训练模型

train_predicted=rf.predict(xtrain)
print(train_predicted) #输出训练集上的预测结果
print(rf.score(xtrain,ytrain)) #输出训练集上的准确率

print(rf.score(xtest,ytest)) #输出验证集上的准确率
print(rf.predict_proba(df1)) #输出测试集上测试的结果(为百分比)
numpy_data=rf.predict_proba(df1)
f=open('C:/sound/result.txt','w')
for i in range (800):  #测试集的数据共800条
    #print(i)
    f.write('\n'+str(numpy_data[i][1])) #写入的是预测为女性的概率
f.close()

运行结果

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!