# 1. Sklearn 简介

Sklearn是一个机器学习的python库，里面包含了几乎所有常见的机器学习与数据挖掘的各种算法。

# 2. 20newsgroups案例

```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)
''' 这是开始提取特征，这里的特征是词频统计。 '''
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
''' 这是开始提取特征，这里的特征是TFIDF特征。 '''
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)

''' 使用朴素贝叶斯分类,并做出简单的预测 '''
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_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]))

''' 使用测试集来评估模型好坏。 '''
from sklearn import metrics
import numpy as np;
twenty_test = fetch_20newsgroups(subset='test',categories=categories, shuffle=True, random_state=42)
docs_test = twenty_test.data
X_test_counts = count_vect.transform(docs_test)
X_test_tfidf = tfidf_transformer.transform(X_test_counts)
predicted = clf.predict(X_test_tfidf)
print(metrics.classification_report(twenty_test.target, predicted,target_names=twenty_test.target_names))
print("accurary\t"+str(np.mean(predicted == twenty_test.target)))```

1. 数据采集
2. 特征提取
3. 模型训练
4. 模型评估

## 2.1 数据采集

```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)```

```##函数原型是这样的。

twenty_train.data是一个list类型，每一个元素是str类型，也就是一篇文章。
twenty_train.target则是它的标签。

## 2.2 特征提取

```''' 这是开始提取特征，这里的特征是词频统计。 '''
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)

''' 这是开始提取特征，这里的特征是TFIDF特征。 '''
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
''' 这是用来转换成矩阵的，里面还有几个能调节的参数tf最大值最小值，停用词等。 转换后的矩阵为系数矩阵，存储方式为（x,y） 目标值。 '''```

## 2.3 模型训练

```''' 使用朴素贝叶斯分类,并做出简单的预测 '''
from sklearn.naive_bayes import MultinomialNB
#这是进行训练的过程。
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_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

## 2.4模型的评估

```''' 使用测试集来评估模型好坏。 '''
from sklearn import metrics
import numpy as np;
twenty_test = fetch_20newsgroups(subset='test',categories=categories, shuffle=True, random_state=42)
docs_test = twenty_test.data
X_test_counts = count_vect.transform(docs_test)
X_test_tfidf = tfidf_transformer.transform(X_test_counts)
predicted = clf.predict(X_test_tfidf)
#使用metrics.classification_report方法可以轻松获取这些信息。
print(metrics.classification_report(twenty_test.target, predicted,target_names=twenty_test.target_names))
#使用这个方法可以比较两个target的差异。
print("accurary\t"+str(np.mean(predicted == twenty_test.target)))```

# 3 小结

1. Sklearn的优势
2. 一个机器学习的大致流程，当然这个案例会比较特殊，我们在以后的讲解中再详细介绍。
3. 知道了如何获取sklearn自带的数据集
4. 知道了如何进行TFIDF特征抽取
5. 知道了如何进行朴素贝叶斯分类的学习和预测过程
6. 知道了如何评估一个机器学习算法的优劣