安装 jupyter

安装

pip install jupyter

运行 jupyter:

jupyter notebook
localhost:8888

scikit-learn

scikit-learn 是基于 Python 环境的深度学习库,为我们封装了深度学习模型训练等一系列的功能, 我们只需要直接针对特定的问题给出训练数据,就可以实现自己的人工智能应用了。

scikit-learn 的项目主页: http://scikit-learn.org

安装

pip install numpy scipy
pip install -U scikit-learn

准备数据

经典的 “20 Newsgroups” 问题。

这个问题就是对新闻做归类。 它把所有的新闻分为 20 个类别,并且通过深度学习,可以将任何一个新闻内容归到这 20 个类别中的一个。

scikit-learn 已经为我们预制了这些经典的数据集。


In [32]:
import logging
logging.basicConfig()

from sklearn.datasets import fetch_20newsgroups

categories = ['alt.atheism', 'soc.religion.christian','comp.graphics', 'sci.med']
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
  • 从 sklearn.datasets 这个库中导入 fetch_20newsgroups 模块
  • 因为 fetch_20newsgroups 的原始数据集比较大,我们这个示例中不用加载全部的数据。 所以我们定义了一个数组 categories = ['alt.atheism', 'soc.religion.christian','comp.graphics', 'sci.med'] 说明了我们要加载的数据类别
  • 最后调用 fetch_20newsgroups 方法获取最终的数据集

In [51]:
print len(twenty_train.data)
print twenty_train.data[0]


2257
From: sd345@city.ac.uk (Michael Collier)
Subject: Converting images to HP LaserJet III?
Nntp-Posting-Host: hampton
Organization: The City University
Lines: 14

Does anyone know of a good way (standard PC application/PD utility) to
convert tif/img/tga files into LaserJet III format.  We would also like to
do the same, converting to HPGL (HP plotter) files.

Please email any response.

Is this the correct group?

Thanks in advance.  Michael.
-- 
Michael Collier (Programmer)                 The Computer Unit,
Email: M.P.Collier@uk.ac.city                The City University,
Tel: 071 477-8000 x3769                      London,
Fax: 071 477-8565                            EC1V 0HB.

整个数据集包含了 2257 个这样的文档。 我们需要用这 2257 条数据来训练我们的模型, 让它变得智能起来。

  • 将每个单词在这篇文章中的出现频次构建成一个数组
  • 直接将单词内容放到数据中比较占用空间,因为深度学习的模型数据都是超大规模的,所以我们需要尽可能的减少数据的空间占用。每个单词应该以数字的方式存放的模型中,并且通过一个映射表来对应
  • 不是每篇文章都会包含所有的单词,这是一个典型的稀疏矩阵

将文本信息映射到字符计数表,以及优化稀疏矩阵等, scikit-learn 都已经帮我们封装好了


In [34]:
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
print(X_train_counts.shape)


(2257, 35788)

X_train_counts 的维度, 包含了 2257 个条目, 每个条目包含了 35788 的字符计数。

这样我们就得到了每篇文章中的字符计数信息。可以根据文章中各个单词出现的频度来训练我们的模型将文章进行分类。

但还有一个问题,一篇较长的文章相应的单词计数肯定会比一篇比较短的文章要多。所以我们用字符计数的绝对值作为模型还不够准确。 可以将单词的绝对计数转换为这个单词在文章中出现的比例。

scikit-learn 依然给我们提供了方便的封装:

TfidfTransformer 这个类可以将我们的数据集进行这样的转换。 关于 TfidfTransformer 的原理我们这里不过多介绍,可以参看 tf-idf 的相关文档 https://en.wikipedia.org/wiki/Tf%E2%80%93idf


In [35]:
from sklearn.feature_extraction.text import TfidfTransformer
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)

训练数据模型

我们这里使用的是 Supervised learning 也叫作受控的学习。 这种深度学习算法是预先将正确的原始数据和结果预期输入到我们的模型中, 然后我们的模型通过这些训练数据不断调整自己的内部结构,再以后遇到新的数据的时候,就能通过以前的这些经验得出最接近的结果了。

  • MultinomialNB 是我们的训练模型,通过 fit 方法传入我们刚刚处理过的数据 X_train_tfidf 以及每条记录对应的期望结果 twenty_train.target
  • 当训练完成后, 我们的模型就有了对任意文章的归类判断能力了。 当然归类的准确度跟我们训练数据的程度有关

In [36]:
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tf, twenty_train.target)
  • 进行一个实际验证

In [37]:
docs_new = ['God is love', 'OpenGL on the GPU is fast', 'learn python']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tf_transformer.transform(X_new_counts)

predicted = clf.predict(X_new_tfidf)

for doc, category in zip(docs_new, predicted):
     print('%r => %s' % (doc, twenty_train.target_names[category]))


'God is love' => soc.religion.christian
'OpenGL on the GPU is fast' => comp.graphics
'learn python' => sci.med
'ibm' => comp.graphics

使用matplotlib作图

可以使用 matplotlib 来进行结果的展示。


In [52]:
%matplotlib inline

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

In [50]:
x = np.linspace(0, 2*np.pi, 500)

plt.plot(x, np.sin(x))
# plt.show()
plt.plot(x, np.sin(x*2))
plt.title('A simple chirp')
plt.show()



In [ ]: