在这篇文章中,我将描述如何使用 fasttext 文本分类器。
快速文本–用于文本分类的机器学习库。让我们试着教她通过歌曲的标题来识别金属乐队。为此,我们使用数据集进行监督学习。
让我们创建一个包含团体名称的歌曲数据集:
__label__metallica fuel
__label__metallica escape
__label__black_sabbath gypsy
__label__black_sabbath snowblind
__label__black_sabbath am i going insane
__label__anthrax anthrax
__label__anthrax i'm alive
__label__anthrax antisocial
[и т.д.]
Формат обучающей выборки:
Обучим fasttext и сохраним модель:
model.save_model("model.bin")
加载经过训练的模型并要求通过歌曲名称来识别组:
predictResult = model.predict("Bleed")
print(predictResult)
В результате мы получим список классов на которые похож данный пример, с указанием уровня похожести цифрой, в нашем случае похожесть названия песни Bleed на одну из групп датасета.
Для того чтобы модель fasttext умела работать с датасетом выходящим за границы обучающей выборки, используют режим autotune с использованием файла валидации (файл тест). Во время автотюна fasttext подбирает оптимальные гиперпараметры модели, проводя валидацию результата на выборке из тест файла. Время автотюна ограничивается пользователем в самостоятельно, с помощью передачи аргумента autotuneDuration.
Пример создания модели с использованием файла тест:
Источники
https://fasttext.cc
https://gosha20777.github.io/tutorial/2018/04/12/fasttext-for-windows
Исходный код
https://gitlab.com/demensdeum/MachineLearning/-/tree/master/6bandClassifier
简单的 TensorFlow 示例
我向您展示一个使用深度学习框架的简单示例 – TensorFlow。在此示例中,我们将教神经网络检测正数、负数和零。安装 TensorFlow 和 CUDA我告诉你,这个任务真的不是一件容易的事)
为了解决分类问题,分类器。 TensorFlow 有几个现成的高级分类器,只需最少的配置即可工作。首先,我们将使用以下方法训练 DNNClassifier具有正数、负数和零的数据集具有正确的“标签”。在人类层面,数据集是一组带有分类结果(标签)的数字:
10 –积极
-22 –负面
0 –零
42 –积极
…其他有分类的号码
接下来,训练开始,之后您可以输入数据集中未包含的数字 –神经网络必须正确识别它们。
下面是分类器的完整代码,带有用于训练和输入数据的数据集生成器:
导入 张量流导入 itertools导入 随机来自 时间 导入时间类 分类号:__number = 0__classifiedAs = 3def __init__(自我,数字):自己.__number =跨度>数字如果数字 == 0:自我.__classifiedAs =跨度> <跨度风格=“颜色:#0000dd;字体重量:粗体;”> 0跨度> <跨度风格=“颜色:#888888;”>#零elif 数字 > 0:自我.__classifiedAs =跨度> <跨度风格=“颜色:#0000dd;字体重量:粗体;”> 1跨度> <跨度风格=“颜色:#888888;”>#积极elif数字 < 0:自我.__classifiedAs =跨度> <跨度风格=“颜色:#0000dd;字体重量:粗体;”> 2跨度> <跨度风格=“颜色:#888888;”>#负面def 数字(自我):返回 自我.__号码def 分类为(自我):返回 自我.__classifiedAsdef classifiedAsString(classifiedAs):如果分类为== 0:返回 “零”elif 分类为 == 1:返回 “正”elif 分类为 == 2:返回 “负”def trainDatasetFunction():trainNumbers = []trainNumberLabels = []对于 i 在 范围(-1000,1001):数字 = ClassifiedNumber(i)trainNumbers.append(number.number())trainNumberLabels.append(number.classifiedAs())返回({“number”:trainNumbers },列车编号标签)def inputDatasetFunction():全局 randomSeedrandom.seed(randomSeed) # 得到相同的结果数字 = []对于我在 范围(0, 4):数字.append(随机.randint(-9999999, 9999999))返回 {“数字”:数字}def main():print("TensorFlow Positive-Negative-Zero 数字分类器测试,由 demensdeum 2017 (demensdeum@gmail. com)")maximalClassesCount = len(设置< /span>(trainDatasetFunction()[1])) + 1numberFeature =tensorflow.feature_column。 numeric_column("数字")分类器 = 张量流.估计器。 DNNClassifier(feature_columns = [numberFeature],hidden_units = [10, 20,10],n_classes = maximalClassesCount)生成器 = 分类器.train(input_fn = trainDatasetFunction,步骤 = 1000).预测(input_fn = 输入数据集函数)inputDataset = inputDatasetFunction()结果 = 列表(itertools。 islice(生成器,len(inputDatasetFunction()[“数字”])))我 = 0for 结果 in 结果:打印("编号:%d 分类为 %s" % (inputDataset["数字"][i], classifiedAsString(结果["class_ids"][0 ])))我 += 1randomSeed = time()主要的()前>
这一切都从 main() 方法开始,我们设置分类器将使用的数字列– tensorflow.feature_column.numeric_column(“number”) 接下来,设置分类器参数。描述当前的初始化参数是没有用的,因为 API 每天都在变化,你绝对应该查看已安装的 TensorFlow 版本的文档,而不是依赖过时的手册。
接下来,启动训练,指示返回从 -1000 到 1000 的数字数据集的函数 (trainDatasetFunction),并根据正数、负数或零对这些数字进行正确分类。接下来,我们提交训练数据集中不存在的输入数字——从 -9999999 到 9999999 (inputDatasetFunction) 随机进行分类。
最后,我们根据输入数据的数量启动迭代(itertools.islice),打印结果,运行它,你会感到惊讶:
number: 4063470 分类为 Positive编号:6006715 分类为阳性编号:-5367127 分类为负面编号:-7834276 分类为负面前>
块引用>
<脚本异步 src="//s.imgur.com/min/embed.js" charset="utf-8">
说实话,我仍然有点惊讶分类器“理解”甚至那些我没有教过的数字。我希望将来我能更详细地了解机器学习这个主题,并且会有更多教程。
GitLab:
https://gitlab.com/demensdeum/MachineLearning
链接:
https://developers.googleblog.com/2017/09/introducing-tensorflow-datasets.html
https://www.tensorflow.org/versions/master/api_docs/python/tf/estimator/DNNClassifier