Phoneme不平衡分类数据集的预测模型 python
许多二元分类任务每个类的示例数量不同,例如类分布倾斜或不平衡。
然而,准确性在这两个类别中同样重要。
一个例子是在语音识别中将欧洲语言的元音声音分类为鼻元音或口元音,其中鼻元音的示例比口元音的示例多得多。分类准确性对于这两个类别都很重要,尽管准确性作为指标不能直接使用。此外,可能需要数据采样技术来转换训练数据集,使其在拟合机器学习算法时更加平衡。
在本教程中,您将了解如何开发和评估鼻音和口腔音素不平衡二元分类的模型。
完成本教程后,您将了解:
- 如何加载和探索数据集并产生数据准备和模型选择的想法。
- 如何评估一套机器学习模型并通过数据过采样技术提高其性能。
- 如何拟合最终模型并使用它来预测特定情况的类标签。
教程概述
本教程分为五个部分;他们是:
- 音素数据集
- 探索数据集
- 模型测试和基线结果
- 评估模型
- 评估机器学习算法
- 评估数据过采样算法
- 对新数据进行预测
Phoneme数据集
在这个项目中,我们将使用一个标准的不平衡机器学习数据集,称为“ Phoneme ”数据集。
该数据集归属于 ESPRIT(欧洲信息技术研究战略计划)项目,名为“ ROARS ”(鲁棒分析语音识别系统),并在该项目的进度报告和技术报告中进行了描述。
ROARS 项目的目标是提高现有分析语音识别系统(即使用有关音节、音素和语音特征的知识的系统)的稳健性,并将其用作具有连接词的语音理解系统的一部分和对话能力。该系统将针对两种欧洲语言的特定应用进行评估
该数据集的目标是区分鼻元音和口元音。
元音被说出并记录到数字文件中。然后从每个声音中自动提取音频特征。
选择五个不同的属性来表征每个元音:它们是五个一次谐波 AHi 的幅度,由总能量 Ene(在所有频率上积分)归一化:AHi/Ene。每个谐波都有符号:当它对应于频谱的局部最大值时为正,否则为负。
—音素数据集描述。
这两种类型的声音有两个类别;他们是:
- 第 0 类:鼻元音(多数类)。
- 第一类:口语元音(少数类)。
接下来,让我们仔细看看数据。
探索数据集
音素数据集是广泛使用的标准机器学习数据集,用于探索和演示专为不平衡分类设计的许多技术。
流行的SMOTE 数据过采样技术就是一个例子。
首先,下载数据集并将其保存在当前工作目录中,名称为“ phoneme.csv ”。
查看文件的内容。
文件的前几行应如下所示:
1.24,0.875,-0.205,-0.078,0.067,0
0.268,1.352,1.035,-0.332,0.217,0
1.567,0.867,1.3,1.041,0.559,0
0.279,0.99,2.555,-0.738,0.0,0
0.307,1.272,2.656,-0.946,-0.467,0
...
我们可以看到给定的输入变量是数字,鼻腔和口腔的类标签分别为 0 和 1。
可以使用read_csv() Pandas 函数将数据集作为 DataFrame 加载,指定位置以及没有标题行的事实。
...
# define the dataset location
filename = 'phoneme.csv'
# load the csv file as a data frame
dataframe = read_csv(filename, header=None)
加载后,我们可以通过打印DataFrame的形状来汇总行数和列数。
...
# summarize the shape of the dataset
print(dataframe.shape)
我们还可以使用Counter对象总结每个类中示例的数量。
...
# summarize the class distribution
target = dataframe.values[:,-1]
counter = Counter(target)
for k,v in counter.items():
per = v / len(target) * 100
print('Class=%s, Count=%d, Percentage=%.3f%%' % (k, v, per))
将它们结合在一起,下面列出了加载和汇总数据集的完整示例。
# load and summarize the dataset
from pandas import read_csv
from collections import Counter
# define the dataset location
filename = 'phoneme.csv'
# load the csv file as a data frame
dataframe = read_csv(filename, header=None)
# summarize the shape of the dataset
print(dataframe.shape)
# summarize the class distribution
target = dataframe.values[:,-1]
counter = Counter(target)
for k,v in counter.items():
per = v / len(target) * 100
print('Class=%s, Count=%d, Percentage=%.3f%%' % (k, v, per))
运行该示例首先加载数据集并确认行数和列数,即 5,404 行、五个输入变量和一个目标变量。
然后对班级分布进行总结,确认了适度的班级不平衡,其中多数班级(鼻音)约占 70%,少数班级(口语)约占 30%。
(5404, 6)
Class=0.0, Count=3818, Percentage=70.651%
Class=1.0, Count=1586, Percentage=29.349%
我们还可以通过为每个输入变量创建直方图来查看五个数字输入变量的分布。
下面列出了完整的示例。
# create histograms of numeric input variables
from pandas import read_csv
from matplotlib import pyplot
# define the dataset location
filename = 'phoneme.csv'
# load the csv file as a data frame
df = read_csv(filename, header=None)
# histograms of all variables
df.hist()
pyplot.show()
运行该示例将为数据集中的五个数值输入变量以及数值类标签中的每一个创建一个包含一个直方图子图的图形。
我们可以看到变量具有不同的尺度,尽管大多数变量似乎具有高斯或类高斯分布。
根据建模算法的选择,我们期望将分布缩放到相同的范围是有用的,并且可能标准化一些幂变换的使用。
我们还可以为每对输入变量创建散点图,称为散点图矩阵。
这有助于查看是否有任何变量彼此相关或沿相同方向变化,例如相关。
我们还可以根据类标签为每个散点图的点着色。在这种情况下,大多数类别(鼻腔)将映射到蓝点,少数类别(口腔)将映射到红点。
下面列出了完整的示例。
# create pairwise scatter plots of numeric input variables
from pandas import read_csv
from pandas import DataFrame
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
# define the dataset location
filename = 'phoneme.csv'
# load the csv file as a data frame
df = read_csv(filename, header=None)
# define a mapping of class values to colors
color_dict = {0:'blue', 1:'red'}
# map each row to a color based on the class value
colors = [color_dict[x] for x in df.values[:, -1]]
# drop the target variable
inputs = DataFrame(df.values[:, :-1])
# pairwise scatter plots of all numerical variables
scatter_matrix(inputs, diagonal='kde', color=colors)
pyplot.show()
运行该示例将创建一个显示散点图矩阵的图,其中有五个图乘五个图,将五个数值输入变量中的每一个进行相互比较。矩阵的对角线显示每个变量的密度分布。
每个配对出现两次,分别在左上角到右下角的对角线上方和下方,提供了两种查看相同变量相互作用的方法。
我们可以看到,两个类标签的许多变量的分布确实不同,这表明类之间的一些合理区分是可行的。
现在我们已经审查了数据集,让我们看看开发一个用于评估候选模型的测试工具。
模型测试和baseline
我们将使用重复分层 k 倍交叉验证来评估候选模型。
k折交叉验证过程提供了对模型性能的良好总体估计,至少与单个训练测试分割相比,并没有过于乐观的偏差。我们将使用 k=10,这意味着每次折叠将包含大约 5404/10 或大约 540 个示例。
分层意味着每个折叠将包含按类别划分的相同示例混合,即大约 70% 到 30% 的鼻元音到口元音。重复表示评估过程将执行多次,以帮助避免侥幸结果并更好地捕获所选模型的方差。我们将使用三个重复。
这意味着单个模型将被拟合和评估 10 * 3 或 30 次,并且将报告这些运行的平均值和标准偏差。
这可以使用RepeatedStratifiedKFold scikit-learn 类来实现。
类标签将被预测,并且两个类标签同样重要。因此,我们将选择一个指标来分别量化模型在两个类别上的性能。
您可能还记得,敏感性是衡量正类准确性的指标,而特异性是衡量负类准确性的指标。
-
灵敏度 = TruePositives / (TruePositives + FalseNegatives)
-
特异性 = 真阴性 / (真阴性 + 假阳性)
G 均值寻求这些分数(几何平均值)的平衡,其中一个或另一个表现不佳会导致 G 均值较低。
- G 平均值 = sqrt(灵敏度 * 特异性)
我们可以使用不平衡学习库提供的Geometric_mean_score() 函数计算模型所做的一组预测的 G 均值。
我们可以定义一个函数来加载数据集并将列拆分为输入和输出变量。下面的load_dataset *()*函数实现了这一点。
# load the dataset
def load_dataset(full_path):
# load the dataset as a numpy array
data = read_csv(full_path, header=None)
# retrieve numpy array
data = data.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
return X, y
然后,我们可以定义一个函数,该函数将评估数据集上的给定模型,并返回每次折叠和重复的 G 均值分数列表。下面的evaluate_model *()*函数实现了这一点,将数据集和模型作为参数并返回分数列表。
# evaluate a model
def evaluate_model(X, y, model):
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define the model evaluation the metric
metric = make_scorer(geometric_mean_score)
# evaluate model
scores = cross_val_score(model, X, y, scoring=metric, cv=cv, n_jobs=-1)
return scores
最后,我们可以使用此测试工具评估数据集上的baseline模型。
预测所有情况的多数类标签 (0) 或少数类标签 (1) 的模型将导致 G 均值为零。因此,一个好的默认策略是以 50% 的概率随机预测一个类别标签或另一个类别标签,目标是 G 均值约为 0.5。
这可以使用scikit-learn 库中的DummyClassifier类并将“ strategy ”参数设置为“ uniform ”来实现。
...
# define the reference model
model = DummyClassifier(strategy='uniform')
一旦模型被评估,我们可以直接报告 G 均值分数的平均值和标准差。
...
# evaluate the model
scores = evaluate_model(X, y, model)
# summarize performance
print('Mean G-Mean: %.3f (%.3f)' % (mean(scores), std(scores)))
将它们结合在一起,下面列出了加载数据集、评估基线模型和报告性能的完整示例。
# test harness and baseline model evaluation
from collections import Counter
from numpy import mean
from numpy import std
from pandas import read_csv
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from imblearn.metrics import geometric_mean_score
from sklearn.metrics import make_scorer
from sklearn.dummy import DummyClassifier
# load the dataset
def load_dataset(full_path):
# load the dataset as a numpy array
data = read_csv(full_path, header=None)
# retrieve numpy array
data = data.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
return X, y
# evaluate a model
def evaluate_model(X, y, model):
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define the model evaluation the metric
metric = make_scorer(geometric_mean_score)
# evaluate model
scores = cross_val_score(model, X, y, scoring=metric, cv=cv, n_jobs=-1)
return scores
# define the location of the dataset
full_path = 'phoneme.csv'
# load the dataset
X, y = load_dataset(full_path)
# summarize the loaded dataset
print(X.shape, y.shape, Counter(y))
# define the reference model
model = DummyClassifier(strategy='uniform')
# evaluate the model
scores = evaluate_model(X, y, model)
# summarize performance
print('Mean G-Mean: %.3f (%.3f)' % (mean(scores), std(scores)))
运行该示例首先加载并汇总数据集。
我们可以看到加载了正确的行数,并且有五个音频派生的输入变量。
接下来,报告 G 均值分数的平均值。
在这种情况下,我们可以看到基线算法的 G-Mean 约为 0.509,接近理论最大值 0.5。该分数提供了模型技能的下限;任何平均 G 均值高于 0.509(或真正高于 0.5)的模型都具有技能,而得分低于该值的模型则在此数据集上不具备技能。
(5404, 5) (5404,) Counter({0.0: 3818, 1.0: 1586})
Mean G-Mean: 0.509 (0.020)
现在我们有了测试工具和性能基线,我们可以开始评估该数据集上的一些模型。
评估模型
在本节中,我们将使用上一节中开发的测试工具在数据集上评估一套不同的技术。
目标是展示如何系统地解决问题,并展示一些针对不平衡分类问题设计的技术的能力。
报告的性能良好,但没有高度优化(例如,未调整超参数)。
**你可以做得更好?**如果您可以使用相同的测试工具获得更好的 G 均值性能,我很想听听。请在下面的评论中告诉我。
评估机器学习算法
让我们首先评估数据集上的混合机器学习模型。
在数据集上抽查一套不同的线性和非线性算法是一个好主意,可以快速找出哪些算法效果好、值得进一步关注,哪些算法不行。
我们将在音素数据集上评估以下机器学习模型:
-
逻辑回归 (LR)
-
支持向量机(SVM)
-
Bagged 决策树
-
随机森林 (RF
-
Extra 的树(ET)
我们将主要使用默认模型超参数,但集成算法中的树数量除外,我们将其设置为合理的默认值 1,000。
我们将依次定义每个模型并将它们添加到列表中,以便我们可以按顺序评估它们。下面的get_models *()*函数定义了用于评估的模型列表,以及用于稍后绘制结果的模型短名称列表。
# define models to test
def get_models():
models, names = list(), list()
# LR
models.append(LogisticRegression(solver='lbfgs'))
names.append('LR')
# SVM
models.append(SVC(gamma='scale'))
names.append('SVM')
# Bagging
models.append(BaggingClassifier(n_estimators=1000))
names.append('BAG')
# RF
models.append(RandomForestClassifier(n_estimators=1000))
names.append('RF')
# ET
models.append(ExtraTreesClassifier(n_estimators=1000))
names.append('ET')
return models, names
然后,我们可以依次枚举模型列表并评估每个模型,报告平均 G 均值并存储分数以供以后绘图。
...
# define models
models, names = get_models()
results = list()
# evaluate each model
for i in range(len(models)):
# evaluate the model and store results
scores = evaluate_model(X, y, models[i])
results.append(scores)
# summarize and store
print('>%s %.3f (%.3f)' % (names[i], mean(scores), std(scores)))
在运行结束时,我们可以将每个分数样本绘制为具有相同比例的箱须图,以便我们可以直接比较分布。
...
# plot the results
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()
将所有这些结合在一起,下面列出了在音素数据集上评估一套机器学习算法的完整示例。
# spot check machine learning algorithms on the phoneme dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from matplotlib import pyplot
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from imblearn.metrics import geometric_mean_score
from sklearn.metrics import make_scorer
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import BaggingClassifier
# load the dataset
def load_dataset(full_path):
# load the dataset as a numpy array
data = read_csv(full_path, header=None)
# retrieve numpy array
data = data.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
return X, y
# evaluate a model
def evaluate_model(X, y, model):
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define the model evaluation the metric
metric = make_scorer(geometric_mean_score)
# evaluate model
scores = cross_val_score(model, X, y, scoring=metric, cv=cv, n_jobs=-1)
return scores
# define models to test
def get_models():
models, names = list(), list()
# LR
models.append(LogisticRegression(solver='lbfgs'))
names.append('LR')
# SVM
models.append(SVC(gamma='scale'))
names.append('SVM')
# Bagging
models.append(BaggingClassifier(n_estimators=1000))
names.append('BAG')
# RF
models.append(RandomForestClassifier(n_estimators=1000))
names.append('RF')
# ET
models.append(ExtraTreesClassifier(n_estimators=1000))
names.append('ET')
return models, names
# define the location of the dataset
full_path = 'phoneme.csv'
# load the dataset
X, y = load_dataset(full_path)
# define models
models, names = get_models()
results = list()
# evaluate each model
for i in range(len(models)):
# evaluate the model and store results
scores = evaluate_model(X, y, models[i])
results.append(scores)
# summarize and store
print('>%s %.3f (%.3f)' % (names[i], mean(scores), std(scores)))
# plot the results
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()
运行该示例会依次评估每个算法并报告平均值和标准差 G 平均值。
注意:由于算法或评估过程的随机性或数值精度的差异,您的结果可能会有所不同。(https://machinelearningmastery.com/different-results-each-time-in-machine-learning/)考虑运行该示例几次并比较平均结果。
在这种情况下,我们可以看到所有测试的算法都有技巧,实现了高于默认值 0.5 的 G 均值。结果表明,决策树算法的集合在此数据集上表现更好,也许额外的树 (ET) 执行最佳 G 平均值约为 0.896。
>LR 0.637 (0.023)
>SVM 0.801 (0.022)
>BAG 0.888 (0.017)
>RF 0.892 (0.018)
>ET 0.896 (0.017)
创建一个图形,显示每个算法的结果样本的箱线图。该框显示中间 50% 的数据,每个框中间的橙色线显示样本的中位数,每个框内的绿色三角形显示样本的平均值。
我们可以看到,所有三种树集成算法(BAG、RF 和 ET)都具有紧密的分布,并且均值和中位数紧密对齐,这可能表明分数的非偏斜和高斯分布,例如稳定。
现在我们已经有了第一组良好的结果,让我们看看是否可以通过数据过采样方法来改进它们。
评估数据过采样算法
数据采样提供了一种在拟合模型之前更好地准备不平衡训练数据集的方法。
最简单的过采样技术是在少数类中复制示例,称为随机过采样。也许最流行的过采样方法是 SMOTE 过采样技术,用于为少数类别创建新的合成示例。
我们将测试五种不同的过采样方法;具体来说:
- 随机过采样 (ROS)
- SMOTE (SMOTE)
- BorderLine SMOTE (BLSMOTE)
- SVM SMOTE (SVMSMOTE)
- ADASYN (ADASYN)
每种技术都将使用上一节中性能最佳的算法(特别是额外树)进行测试。
我们将为每个过采样算法使用默认的超参数,该算法将对少数类进行过采样,使其具有与训练数据集中的多数类相同数量的示例。
我们期望,与没有过采样的算法相比,每种过采样技术都会带来性能提升,其中随机过采样提供的最小提升可能是 SMOTE 或其变体之一提供的最佳提升。
我们可以更新*get_models()*函数以返回要评估的过采样算法列表;例如:
# define oversampling models to test
def get_models():
models, names = list(), list()
# RandomOverSampler
models.append(RandomOverSampler())
names.append('ROS')
# SMOTE
models.append(SMOTE())
names.append('SMOTE')
# BorderlineSMOTE
models.append(BorderlineSMOTE())
names.append('BLSMOTE')
# SVMSMOTE
models.append(SVMSMOTE())
names.append('SVMSMOTE')
# ADASYN
models.append(ADASYN())
names.append('ADASYN')
return models, names
然后,我们可以枚举每个并从不平衡学习库创建一个管道,该管道知道如何对训练数据集进行过采样。这将确保交叉验证模型评估中的训练数据集被正确采样,而不会出现可能导致对模型性能进行乐观评估的数据泄漏。
首先,我们将对输入变量进行归一化,因为大多数过采样技术将利用最近邻算法,并且在使用此技术时所有变量具有相同的尺度非常重要。接下来将是给定的过采样算法,然后以适合过采样训练数据集的额外树算法结束。
...
# define the model
model = ExtraTreesClassifier(n_estimators=1000)
# define the pipeline steps
steps = [('s', MinMaxScaler()), ('o', models[i]), ('m', model)]
# define the pipeline
pipeline = Pipeline(steps=steps)
# evaluate the model and store results
scores = evaluate_model(X, y, pipeline)
将它们结合在一起,下面列出了在音素数据集上使用额外树评估过采样算法的完整示例。
# data oversampling algorithms on the phoneme imbalanced dataset
from numpy import mean
from numpy import std
from pandas import read_csv
from matplotlib import pyplot
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from imblearn.metrics import geometric_mean_score
from sklearn.metrics import make_scorer
from sklearn.ensemble import ExtraTreesClassifier
from imblearn.over_sampling import RandomOverSampler
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import BorderlineSMOTE
from imblearn.over_sampling import SVMSMOTE
from imblearn.over_sampling import ADASYN
from imblearn.pipeline import Pipeline
# load the dataset
def load_dataset(full_path):
# load the dataset as a numpy array
data = read_csv(full_path, header=None)
# retrieve numpy array
data = data.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
return X, y
# evaluate a model
def evaluate_model(X, y, model):
# define evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define the model evaluation the metric
metric = make_scorer(geometric_mean_score)
# evaluate model
scores = cross_val_score(model, X, y, scoring=metric, cv=cv, n_jobs=-1)
return scores
# define oversampling models to test
def get_models():
models, names = list(), list()
# RandomOverSampler
models.append(RandomOverSampler())
names.append('ROS')
# SMOTE
models.append(SMOTE())
names.append('SMOTE')
# BorderlineSMOTE
models.append(BorderlineSMOTE())
names.append('BLSMOTE')
# SVMSMOTE
models.append(SVMSMOTE())
names.append('SVMSMOTE')
# ADASYN
models.append(ADASYN())
names.append('ADASYN')
return models, names
# define the location of the dataset
full_path = 'phoneme.csv'
# load the dataset
X, y = load_dataset(full_path)
# define models
models, names = get_models()
results = list()
# evaluate each model
for i in range(len(models)):
# define the model
model = ExtraTreesClassifier(n_estimators=1000)
# define the pipeline steps
steps = [('s', MinMaxScaler()), ('o', models[i]), ('m', model)]
# define the pipeline
pipeline = Pipeline(steps=steps)
# evaluate the model and store results
scores = evaluate_model(X, y, pipeline)
results.append(scores)
# summarize and store
print('>%s %.3f (%.3f)' % (names[i], mean(scores), std(scores)))
# plot the results
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()
运行该示例将使用数据集上的 Extra Trees 模型评估每种过采样方法。
注意:由于算法或评估过程的随机性或数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。
在这种情况下,正如我们所预期的,除了随机过采样技术之外,每种过采样技术都会导致没有任何过采样的 ET 算法的性能提升 (0.896)。
结果表明,SMOTE 和 ADASYN 的修改版本比默认 SMOTE 表现更好,在这种情况下,ADASYN 获得了最佳 G 平均分数 0.910。
>ROS 0.894 (0.018)
>SMOTE 0.906 (0.015)
>BLSMOTE 0.909 (0.013)
>SVMSMOTE 0.909 (0.014)
>ADASYN 0.910 (0.013)
结果的分布可以与箱线图和须线图进行比较。
我们可以看到,所有分布都大致具有相同的紧密分布,并且结果均值的差异可用于选择模型。
接下来,让我们看看如何使用最终模型对新数据进行预测。
对新数据进行预测
在本节中,我们将拟合最终模型并使用它对单行数据进行预测
我们将使用 Extra Trees 模型的 ADASYN 过采样版本作为最终模型,并在拟合模型和进行预测之前对数据进行归一化缩放。使用管道将确保转换始终正确执行。
首先,我们可以将模型定义为管道。
...
# define the model
model = ExtraTreesClassifier(n_estimators=1000)
# define the pipeline steps
steps = [('s', MinMaxScaler()), ('o', ADASYN()), ('m', model)]
# define the pipeline
pipeline = Pipeline(steps=steps)
一旦定义,我们就可以将其拟合到整个训练数据集上。
...
# fit the model
pipeline.fit(X, y)
一旦拟合,我们可以通过调用*predict()*函数使用它来对新数据进行预测。这将返回类别标签 0(代表“鼻腔”)或 1(代表“口腔”)。
例如:
...
# define a row of data
row = [...]
# make prediction
yhat = pipeline.predict([row])
为了证明这一点,我们可以使用拟合模型对一些我们知道案例是鼻腔还是口腔的案例进行一些标签预测。
下面列出了完整的示例。
# fit a model and make predictions for the on the phoneme dataset
from pandas import read_csv
from sklearn.preprocessing import MinMaxScaler
from imblearn.over_sampling import ADASYN
from sklearn.ensemble import ExtraTreesClassifier
from imblearn.pipeline import Pipeline
# load the dataset
def load_dataset(full_path):
# load the dataset as a numpy array
data = read_csv(full_path, header=None)
# retrieve numpy array
data = data.values
# split into input and output elements
X, y = data[:, :-1], data[:, -1]
return X, y
# define the location of the dataset
full_path = 'phoneme.csv'
# load the dataset
X, y = load_dataset(full_path)
# define the model
model = ExtraTreesClassifier(n_estimators=1000)
# define the pipeline steps
steps = [('s', MinMaxScaler()), ('o', ADASYN()), ('m', model)]
# define the pipeline
pipeline = Pipeline(steps=steps)
# fit the model
pipeline.fit(X, y)
# evaluate on some nasal cases (known class 0)
print('Nasal:')
data = [[1.24,0.875,-0.205,-0.078,0.067],
[0.268,1.352,1.035,-0.332,0.217],
[1.567,0.867,1.3,1.041,0.559]]
for row in data:
# make prediction
yhat = pipeline.predict([row])
# get the label
label = yhat[0]
# summarize
print('>Predicted=%d (expected 0)' % (label))
# evaluate on some oral cases (known class 1)
print('Oral:')
data = [[0.125,0.548,0.795,0.836,0.0],
[0.318,0.811,0.818,0.821,0.86],
[0.151,0.642,1.454,1.281,-0.716]]
for row in data:
# make prediction
yhat = pipeline.predict([row])
# get the label
label = yhat[0]
# summarize
print('>Predicted=%d (expected 1)' % (label))
运行示例首先在整个训练数据集上拟合模型。
然后使用拟合模型来预测从数据集文件中选择的鼻病例的标签。我们可以看到所有情况都被正确预测。
然后将一些口述案例作为模型的输入并预测标签。正如我们所希望的那样,所有情况都会预测出正确的标签。
Nasal:
>Predicted=0 (expected 0)
>Predicted=0 (expected 0)
>Predicted=0 (expected 0)
Oral:
>Predicted=1 (expected 1)
>Predicted=1 (expected 1)
>Predicted=1 (expected 1)
进一步阅读
如果您想深入了解,本节提供了有关该主题的更多资源。
文件
概括
在本教程中,您了解了如何开发和评估鼻音和口腔音素不平衡二元分类的模型。
具体来说,您了解到:
- 如何加载和探索数据集并产生数据准备和模型选择的想法。
- 如何评估一套机器学习模型并通过数据过采样技术提高其性能。
0.836,0.0],
[0.318,0.811,0.818,0.821,0.86],
[0.151,0.642,1.454,1.281,-0.716]]
for row in data:make prediction
yhat = pipeline.predict([row])get the label
label = yhat[0]summarize
print(‘>Predicted=%d (expected 1)’ % (label))
运行示例首先在整个训练数据集上拟合模型。
然后使用拟合模型来预测从数据集文件中选择的鼻病例的标签。我们可以看到所有情况都被正确预测。
然后将一些口述案例作为模型的输入并预测标签。正如我们所希望的那样,所有情况都会预测出正确的标签。
Nasal:
Predicted=0 (expected 0)
Predicted=0 (expected 0)
Predicted=0 (expected 0)
Oral:
Predicted=1 (expected 1)
Predicted=1 (expected 1)
Predicted=1 (expected 1)
## 进一步阅读
如果您想深入了解,本节提供了有关该主题的更多资源。
### 文件
- [ESPRIT:欧洲信息技术研究与开发战略计划](https://www.aclweb.org/anthology/H91-1007.pdf)。
## 概括
在本教程中,您了解了如何开发和评估鼻音和口腔音素不平衡二元分类的模型。
具体来说,您了解到:
- 如何加载和探索数据集并产生数据准备和模型选择的想法。
- 如何评估一套机器学习模型并通过数据过采样技术提高其性能。
- 如何拟合最终模型并使用它来预测特定情况的类标签。