安装
pip install jupyter
运行 jupyter:
jupyter notebook
localhost:8888
scikit-learn 是基于 Python 环境的深度学习库,为我们封装了深度学习模型训练等一系列的功能, 我们只需要直接针对特定的问题给出训练数据,就可以实现自己的人工智能应用了。
scikit-learn 的项目主页: http://scikit-learn.org
pip install numpy scipy
pip install -U 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)
In [51]:
print len(twenty_train.data)
print twenty_train.data[0]
整个数据集包含了 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)
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)
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]))
可以使用 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 [ ]: