GoogleML系列目前共七个短视频,内容通俗易懂
Lesson1 Hello World
1 | from sklearn import tree |
Lesson 2 Visualizing a Decision Tree
Why decision Tree
- easy to read and understand
Iris(Wiki)
- 经典的ML问题,花类型识别
- 四个features,三个labels
- 直接从sklearn导入
1 | # 查看数据 |
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
['setosa' 'versicolor' 'virginica']
[ 5.1 3.5 1.4 0.2]
0
1 | # 建立决策树分类器 |
[0 1 2]
[0 1 2]
Visualize 可视化
使用pydot
pip install pydotplus
conda install graphviz
GraphViz’s executables not found
- 下载graphviz
- 安装,记下安装路径,如C:\Program Files (x86)\Graphviz2.38\bin
- 将路径添加到系统环境变量
- 重启IDE
1 | from IPython.display import Image |
Lesson 3 What Makes a Good Feature
- 多个feature能更好的训练模型
- 重复特征应当删除,否则分类器会多次使用相同特征,导致该特征被强调
- feature分布越均匀,该feature对分类的作用越弱
- feature应相互独立
- feature应预处理,如经纬度信息经过转化可以形成距离等
- 总结
- informative
- independent
- simple
1 | import numpy as np |
Lesson 4 Let’s Write a Pipeline
- 划分训练集跟测试集,在训练集上训练,测试集上验证
- 调用sklearn.cross_validation.train_test_split切分数据集
- 本质上,是学习feature到label,从输入到输出的函数
- 神经网络演示playground
1 | # import a dataset |
tree_clf accuracy: 0.946666666667
kn_clf accuracy: 0.986666666667
Lesson 5 Writing Our First Classifier
简单的随机分类器
1 | import random |
accuracy: 0.36
KNN (K-Nearest Neighbour)
- 考虑测试点的近邻K个点,K个点中,属于某一类最多,则该点属于该类
- 距离公式,平方和开方
- 注意:
- 实现时先确定接口(fit, predict)
- 对每个接口实现时先确定输入输出
- K = 1
1 | from scipy.spatial import distance |
accuracy: 0.986666666667
Lesson 6 Train an Image Classifier with TensorFlow for Poets
No feature engineering needed!!!
数据
- 五种花图片 218MB
- 如果你想要用其他的图片类型,你只需要创建一个新的文件夹,放入对应类型的100张以上的图片
Diversity and quantity
- Diversity:样本多样性越多,对新事物的预测能力越强
- Quantity:样本数量越多,分类器越强大
以下代码在Linux下执行
1 | from sklearn import datasets, cross_validation |
Test Accuracy: 1.000000
Lesson 7 Classifying Handwritten Digits with TF.Learn
mnist问题
- the Hello World of computer vision
- 训练集55,000,测试集10,000,每张图片处理成28*28的二维矩阵,784 features
- 十分类问题
1 | import numpy as np |
Import the dataset
1 | mnist = learn.datasets.load_dataset('mnist') |
Extracting MNIST-data/train-images-idx3-ubyte.gz
Extracting MNIST-data/train-labels-idx1-ubyte.gz
Extracting MNIST-data/t10k-images-idx3-ubyte.gz
Extracting MNIST-data/t10k-labels-idx1-ubyte.gz
显示
1 | def display(i): |
number of features is 784
fit a Linear Classifier
1 | feature_columns = learn.infer_real_valued_columns_from_input(data) |
0.9137
Visualize learned weights
1 | weights = classifier.weights_ |
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-32-13532f014713> in <module>()
----> 1 weights = classifier.weights_
2 f, axes = plt.subplots(2, 5, figsize=(10,4))
3 axes = axes.reshape(-1)
4 for i in range(len(axes)):
5 a = axes[i]
AttributeError: 'LinearClassifier' object has no attribute 'weights_'
附录代码分析 From ahangchen
代码分析
- 下载数据集
1 | mnist = learn.datasets.load_dataset('mnist') |
恩,就是这么简单,一行代码下载解压mnist数据,每个img已经灰度化成长784的数组,每个label已经one-hot成长度10的数组
- numpy读取图像到内存,用于后续操作,包括训练集(只取前10000个)和验证集
1 | data = mnist.train.images |
- 可视化图像
1 | def display(i): |
用matplotlib展示灰度图
- 训练分类器
- 提取特征(这里每个图的特征就是784个像素值)
1 | feature_columns = learn.infer_real_valued_columns_from_input(data) |
- 创建线性分类器并训练
1 | classifier = learn.LinearClassifier(feature_columns=feature_columns, n_classes=10) |
注意要制定n_classes为labels的数量
- 分类器实际上是在根据每个feature判断每个label的可能性,
- 不同的feature有的重要,有的不重要,所以需要设置不同的权重
一开始权重都是随机的,在fit的过程中,实际上就是在调整权重
最后可能性最高的label就会作为预测输出
- 传入测试集,预测,评估分类效果
1 | result = classifier.evaluate(test_data, test_labels) |
速度非常快,而且准确率达到91.4%
可以只预测某张图,并查看预测是否跟实际图形一致
1 | # here's one it gets right |
- 可视化权重以了解分类器的工作原理
1 | weights = classifier.weights_ |
- 这里展示了8个张图中,每个像素点(也就是feature)的weights,
- 红色表示正的权重,蓝色表示负的权重
- 作用越大的像素,它的颜色越深,也就是权重越大
- 所以权重中红色部分几乎展示了正确的数字