A brief introduction to
Machine Learning
https://ihower.tw
RubyConf China 2017
我是谁
• 张⽂文钿 a.k.a. ihower
• https://ihower.tw
• Ruby on Rails 实战圣经 作者
• 全栈营研究员
• Ruby Developer user since 2006
• 过去两年年业余关注机器学习技术
Agenda
• 什什么是机器学习
• 搭建机器学习系统
• 什什么是深度学习
• 如何在 Rails 项⽬目中使⽤用机器学习
1. 什什么是机器学习
要解决什什么问题?
	•	 如何判断是不是垃圾邮件?

	•	 如何预测⼴广告点击率?

	•	 如何分类客户评论的情绪?

	•	 如何推荐客户想买的东⻄西?

	•	 如何辨识语⾳音?

	•	 如何辨识图片?
机器学习
	•	让电脑⾃自⼰己去学,⽽而不⽤用明确的写条件判断程序

	•	所谓学习,就是学怎么分类下判断

	•	如何学?需要透过历史数据和机器学习算法,让电脑学出
⼀一个模型,透过这个模型来进⾏行行预测和辨识。
机器学习的基本过程
训练数据
Training Data
机器学习算法
Algorithm
机器学习模型
Model
训练数据
Training Data
机器学习算法
Algorithm
机器学习模型
Model
新的数据
预测结果
先从回答Yes/No开始
Binary Classification
历史数据
年年紀 性別 資產 ⾏行行業 … 會不會買
21 M 120 … 會
50 F 800 … 不會
41 F 400 … 會
35 M 300 … 會
36 M 500 … 不會
28 M 60 … 不會
55 F 950 … 會
转换成训练数据
X1

(Feature 1)
X2

(Feature 2)
Y

(Label 答案)
21 120 1
50 800 -1
41 400 1
35 300 1
36 500 -1
28 60 -1
55 950 1
感知器(Perceptron)
例例如,在⼆二维(两个 features )的情况:
拿第⼀一个数据来看,希望预测的结果是 1
如果是 d 维(d个 features )的情况:
怎么求权重 w ?

假设只有两个 feature,就会是个⼆二维问题可以做图⽰示意
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
怎么求权重 w ?

假设只有两个 feature,就会是个⼆二维问题可以做图⽰示意
Perceptron Learning
Algorithm (PLA)
	•	先假设 w = 0,然后依序走访所有分错的点 X_n

	•	让 让下⼀一个 w 朝分错的点偏移

	•	最后的 w 就是解
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Pocket PLA
	•	不⼀一定线性可分

	•	改成随机找⼀一个错误的点

	•	在有限的次数内,找最好的w
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
机器学习的种类
机器学习的种类
	•	监督式学习 (Supervised Learning)

	•	半监督式学习 (Semi-supervised Learning)

	•	非监督式学习 (Unsupervised Learning)

	•	强化学习 (Reinforcement Learning)
监督式学习
数据中有答案(label) 让算法可以学习
	•	 分类 (Classification)

	 •	 ⼆二元分类

	 •	 多元分类

	•	 回归 (Regression) 数值

	 •	 价格

	 •	 下雨机率
半监督式学习
资料中有些有答案(label) 让算法可以学习
	•	例例如照片分类,有些照片有 label,有些没有
非監督式學習
数据中没答案,需要算法⾃自⼰己找出数据中隐藏的结构或规则
	 •	分群(Clustering)

	 •	K-means 算法

	 •	异常值侦测

	 •	深度学习 ⽣生成对抗⽹网络(GAN)

	 •	⽤用于模仿图片、视频等
Credit: https://en.wikipedia.org/wiki/Cluster_analysis
强化学习
	•	透过外在的讯号不断改进算法

	•	不容易易直接⽰示范答案(y),但可以透过环境的
反应得知结果好或不好

	•	例例如:训练⼩小狗坐下
https://en.wikipedia.org/wiki/Reinforcement_learning
常⻅见的监督式学习算法
• Linear Regression 、Linear Classifier

• Logistic Regression

• Decision Tree、Random forest

• Naive Bayes classifiers

• Support Vector Machine (SVM)

• Artificial Neural Network (ANN)
线性回归(Linear Regression)
	•	 优化均⽅方误差 

	•	 有公式解

	•	 但数据量量⼤大时,会改⽤用 Gradient
Descent 梯度下降法
Gradient Descent
已知 f(w) 如何找出最⼩小值 w ?
Image Credit: edX BerkeleyX: CS190.1x Scalable Machine Learning
http://lukaszkujawa.github.io//gradient-descent.html
# https://github.com/daugaard/linear-regression
# gem install ruby_linear_regression
require 'ruby_linear_regression'
x_data = [ [1,1], [2,2], [3,3], [4,4] ]
y_data = [ 1,2,3,4 ]
linear_regression = RubyLinearRegression.new
linear_regression.load_training_data(x_data, y_data)
linear_regression.train_gradient_descent(0.0005, 1000, true)
prediction_x = [5, 5]
prediction_y = linear_regression.predict(prediction_x)
puts prediction_y
Nonlinear Transformation
非线性变换
• 	例例如⼆二次⽅方变换,把





扩展成
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
Logistic Regression
	•	输出 0~1 的值

	•	⽤用于机率预测、⻛风险、可能性,⼜又叫 "soft" binary
classification
# gem install liblinear-ruby
# https://github.com/kei500/liblinear-ruby
# https://www.practicalai.io/implementing-classification-using-
logistic-regression-in-ruby/
require 'liblinear'
model = Liblinear.train(
{ solver_type: Liblinear::L2R_LR }, # L2-regularized logistic
[-1, -1, 1, 1], # labels
[[-2, -2], [-1, -1], [1, 1], [2, 2]], # training data
)
puts Liblinear.predict(model, [0.5, 0.5])
Binary 推⼴广到 Mutilclass
	•	OVA (One-Versus-All) 或叫做 One-vs-Rest (OvR) 

	 •	有多少类别就各做⼀一次 binary classification

	 •	选分类机率最⼤大的
Decision Tree
	•	决策树、分类树

	•	由上⽽而下在每⼀一步选择⼀一个最
好的属性(feature)来分裂决策
树

	•	優點:有很好的解释性
http://www.r2d3.us/visual-intro-
to-machine-learning-part-1/
# https://github.com/igrigorik/decisiontree
# gem install decisiontree
# gem install graphr
require 'decisiontree'
attributes = ['Age', 'Education', 'Income', 'Marital Status']
training = [
['36-55', 'Masters', 'High', 'Single', 1],
['18-35', 'High School', 'Low', 'Single', 0],
['< 18', 'High School', 'Low', 'Married', 1]
]
dec_tree = DecisionTree::ID3Tree.new(attributes, training,
1, :discrete)
dec_tree.train
test = ['< 18', 'High School', 'Low', 'Single', 0]
decision = dec_tree.predict(test)
puts "Predicted: #{decision} ... True decision: #{test.last}";
dec_tree.graph("discrete")
⽀支持向量量機 SVM

(Support Vector Machine)
	•	如何让分类器更更能抵抗杂讯?找⼀一条最胖(margin)的线

	•	离边界最近的点就决定线 (这些点就叫做 support
vector candidate),其他点不影响结果
	•	优点:精确度好、但计算很花时间,不适合巨量量数据
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
# gem install rb-libsvm
# https://www.practicalai.io/implementing-classification-using-a-svm-
in-ruby/
require 'libsvm'
# This library is namespaced.
problem = Libsvm::Problem.new
parameter = Libsvm::SvmParameter.new
parameter.cache_size = 1 # in megabytes
parameter.eps = 0.001
parameter.c = 10
examples = [ [1,0,1], [-1,0,-1] ].map {|ary|
Libsvm::Node.features(ary) }
labels = [1, -1]
problem.set_examples(labels, examples)
model = Libsvm::Model.train(problem, parameter)
pred = model.predict(Libsvm::Node.features(1, 1, 1))
puts "Example [1, 1, 1] - Predicted #{pred}"
awesome-ruby
• https://github.com/arbox/machine-learning-with-ruby
FAQ
	•	机器学习什什么都可以学吗? 

	•	⼀一定要⼤大量量数据吗?

	•	机器预测的结果就⼀一定准吗?
2.搭建机器学习系统
重点是算法吗?
在实际的应⽤用场景中,
还有很多⿇麻烦事.....
•	 数据如何收集?

	•	 会不会有缺漏或错误? 数据需要清理理

	•	 Features 如何决定? 把所有 Features 全部丢进算法可以吗?

	 •	 计算需要数字,可是很多数据是字符串串啊

	 •	 原始数据怎么处理理?例例如图片、影像、声⾳音

	 •	 有的 feature 数字很⼤大、有的 feature 数字很⼩小怎么办?

	•	 如何挑选和评估模型? 

	•	 如何整合进应⽤用中?

	•	 数据量量超级⼤大怎么办?
算法只是全部流程中的⼀一部分
其实这是⼀一场数据科学实验
机器学习的完整流程
	•	 数据收集、撷取

	•	 数据探索 (Exploratory data analysis)、视觉化

	•	 数据清理理、预处理理

	•	 数据切分 (Train data, Test data)

	•	 选择算法、建立模型、评估模型

	•	 整合进应⽤用程序 (或进⾏行行发表)
数据撷取、收集
	•	爬⾍虫 (HTML)

	•	结构化的数据

	 •	数据库

	•	非结构化的数据

	 •	图片、声⾳音、⽂文字
预处理理
	•	 缺失值处理理: 删除或补全
	•	 标准化数值 

	 •	 让平均是0、标准差是 1

	 •	 让不同 features 的数值能够公平,消除数量量级的影响

	•	 类别 (categorical) 资料编码 

	 •	 有顺序的,可⽤用数字

	 •	 没顺序的,⽤用 one-hot encoding
One-Hot-Encoding
	•	 例例如 { “IE”, “Chrome”, “Safari” } 三个分类

	•	 转成三种 features

	 •	 “IE” => [ 1 0 0 ]

	 •	 “Chrome” => [ 0 1 0 ]

	 •	 “Safari” => [ 0 0 1 ]

	•	 如果维度太多,可以考虑进⼀一步做 Feature Hashing
Feature Extraction (特征萃取)
	•	 将数据中有利利于分类的特征撷取出来,	可能需要将数据视觉化,帮助
我们理理解数据进⾏行行挑选

	•	 需要 Domain Knowledge,引入額外特徵

	 •	 已知⽤用⼾戶 Geolocation,增加該地點的⼈人⼝口統計數據(平均收入、⼈人
⼝口密度等等) 

•	家庭⽤用電隨著溫度升⾼高,因此預測⽤用電量量時,應該把溫度加入特徵

	•	 原始数据若若是非数字的,需要想办法撷取出数字特征

	 •	 例例如:图片/声⾳音/⾃自然语⾔言⽂文字
Bag of Words (词袋模型)
(1) John likes to watch movies. Mary likes movies too.
(2) John also likes to watch football games.
[1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
[
"John",
"likes",
"to",
"watch",
"movies",
"also",
"football",
"games",
"Mary",
"too"
]
https://zh.wikipedia.org/zh-cn/词袋模型
Feature 越多越好?
模型越厉害越好?
让算法做到 100% 准确?
Overfitting 过拟合现象
Image Credit: edX BerkeleyX: CS190.1x Scalable Machine Learning
Overfitting 过拟合现象
Credit: 林林軒⽥田老師 http://www.csie.ntu.edu.tw/~htlin/mooc/ 機器學習課程
考虑的越复杂,结果却
越不准!
⽣生活中的例例⼦子
	•	饮食,⼈人类喜欢吃脂肪、糖、盐

	•	运动,⻄西洋剑和跆拳道,电⼦子计分

	•	激励机制 KPI,例例如猎⼈人头公司的 KPI 如果⽤用安排⾯面试次
数....
⼈人的思考也是⼀一样
Overfitting 怎么解?
•	当 features 太多,或模型太厉害的时候
	•	Overfitting 怎么解

	 •	减少 features,挑选真正有⽤用的

	 •	减少模型复杂度,例例如增加 regularization 正则化、剪枝、
Early Stop…etc 在计算过程中去惩罚复杂模型
Underfitting 怎么解?
•	当 Training dataset 和 Validation dataset 准确率都不⾼高时
	•	增加 features、增加⾼高次⽅方变项

	•	模型不够复杂,换更更厉害的算法

	•	数据太少,想办法增加数据
数据切分和模型评估
如何得知⽬目前是⽋欠拟合还是过拟合?需要仪表板
	•	 切分 Training Dataset 和 Testing Dataset,通常约 7:3

•	 当 Training dataset 跟 Validation dataset 准确率都不好 =>
Underfitting
•	 当 Training dataset 准确率提⾼高,但是 Validation dataset 准确率
却下降时 => Overfitting
	•	 如何挑选和评估模型? 

	 •	 需要换不同 model 进⾏行行实验
	 •	 如果⽤用 Gradient Descent 梯度下降法:需要调整超参数
更更像是在做科学实验....
	•	不知道哪⼀一个算法比较好

	•	需要不断实验和比较结果

	•	如果每个算法的⽤用法都不⼀一致,就会很⿇麻烦
现成的 Ruby ML ⼯工具
	•	⽤用法都不同

	•	缺乏 预处理理功能

	•	缺乏 Cross-Validation 功能

	•	缺乏维护....

	•	很像是 Toy Project…
Sorry…
Ruby 没办法做个流程
⽬目前主流是 Python 和 R 语⾔言
😵
Python ⼯工具介紹
• Scikit-learn: Python 的 Machine Learning 框架

• Pandas: 提供 Data frames 數據分析

• Matplotlib 視覺化⼯工具

• Jupyter notebook 實驗簿

• PySpark ⼤大數據處理理
Scikit-learn
• Scikit-learn 提供⼀一致的數據格式

• 提供各種機器學習和預處理理算法,可以在相同的介⾯面下進
⾏行行快速實驗

• 已是⾏行行業標準
http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
Jupyter notebook
Demo
鳶尾花根據花萼、花瓣長寬
判斷三種品種
3. 深度学习
近來來最夯的機器學習算法
Credit: http://www.cnblogs.com/gpcuster/archive/2008/06/03/1213008.html
⼈人⼯工神经⽹网络
Credit: 李宏毅 深度學習課程
Neuron
Credit: 李宏毅 深度學習課程
Credit: 李宏毅 深度學習課程
權重w怎麼算?
https://zh.wikipedia.org/wiki/反向传播算法
MNIST 数据集:⼿手写数字辨识
	•	28*28=784 pixel

	•	假設有⼀一層 Hidden layer 有 100
個 Neuron

	•	784*100+100*10 = 

约八万个权重值

	•	学习过程要很久,但是预测很快
http://yann.lecun.com/exdb/mnist/
# https://github.com/tangledpath/ruby-fann
require 'ruby-fann'
train = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1,
0.2, 0.3]], :desired_outputs=>[[0.7], [0.8]])
fann = RubyFann::Standard.new(:num_inputs=>3, :hidden_neurons=>[2,
8, 4, 3, 4], :num_outputs=>1)
fann.train_on_data(train, 1000, 10, 0.1) # 1000 max_epochs, 10
errors between reports and 0.1 desired MSE (mean-squared-error)
puts fann.run([0.3, 0.2, 0.4])
http://playground.tensorflow.org
Credit: 李宏毅 深度學習課程
深度学习特点
	•	直接处理理原始数据,不需要⼈人⼯工撷取 feature:可以处理理图片、
声⾳音、⾃自然语⾔言

	•	以前不⾏行行做是因为算⼒力力不够强⼤大、数据量量不够多,⽆无法处理理深
层⽹网络
•	优点:可以处理理很⾼高度复杂的问题,例例如影像和声⾳音辨识

	•	缺点:1. 训练难度较⾼高,模型太复杂不容易易控制 2. 解释性差,
只知道模型好不好,很难解释为什什么
卷积神经⽹网络
• Convolutional Neural Network (CNN)

• ANN 做圖片辨識做不好,計算量量太⼤大

• CNN 針對圖片的特性做調整

• Convolution Layer

• Max pooling
Credit: 李宏毅 深度學習課程
https://www.ted.com/talks/
fei_fei_li_how_we_re_teaching_computers_to_understand_
http://www.image-net.org
Credit: 了了解⼈人⼯工智慧的第⼀一本書 松尾豐
全球視覺辨識⼤大賽
深度学习⼯工具
• Google 的 Tensorflow

• Facebook 的 Caffe

• 微軟的 CNTK

• MXNet (Amazon官⽅方推薦)

• PyTorch

• Theano
硬件战场
• Nvidia GPU (CUDA 架構)

• Google TPU

• Intel Movidius

• Apple “Neural Engine” chip (iPhone X)
Keras
• https://keras.io

• 	⼀一个⾼高阶的 API,底层可以跑 TensorFlow、CNTK 或
Theano
model = Sequential()
model.add(Dense(512, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation('softmax'))
model.summary()
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
history = model.fit(X_train, Y_train,
batch_size=batch_size, nb_epoch=nb_epoch,
verbose=1, validation_data=(X_test, Y_test))
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])
4. 如何整合进 Rails
训练部分
	•	继续⽤用 Ruby (are you serious?)

	•	⽤用 Python 或 R ⽅方案

	•	⼤大数据:⽤用 Apache Spark
预测部分
• 汇出 model 参数,⽤用 Ruby 实作预测
• But…. How about feature engineering part?
• 调⽤用 Python 程序
• Web API ⽅方案: ⽤用 flask
• RPC ⽅方案 grpc
• pycall 直接調⽤用 python function
• 第三⽅方 API (GCP,AWS,Azure)
Apple Core ML
https://developer.apple.com/documentation/coreml
Cloud Solution
• Amazon Web Service

• Google Cloud Platform

• Microsoft Azure
Google Cloud
	•	 ⽤用⾃自⼰己的资料做训练

	 •	 Cloud Machine Learning Engine

	•	 Machine Learning as API ⽤用现成的模型

	 •	 Cloud Vision

	 •	 Cloud Speech

	 •	 Cloud Natural Language

	 •	 Cloud Translation API

	 •	 Cloud Video Intelligence
# gem install google-cloud-vision
# export GOOGLE_CLOUD_PROJECT=“<project-id>“
# export GOOGLE_CLOUD_KEYFILE=“<json-key-file>“
require "google/cloud/vision"
vision = Google::Cloud::Vision.new
image = vision.image "demo-image.jpg"
puts image.labels
https://cloud.google.com/vision/
What’s next?
⼀一些想法
	•	数据科学家(Data Scientist) v.s. 数据⼯工程师(Data Engineer)

	•	不⼀一定要成为数据科学家才能利利⽤用机器学习

	•	A.I. is a feature,we will just use it as a gem

	•	⼯工程师及早参与,最后才能成功进入产品,⽽而不是只是数据
科学报告
如何学机器学习
	•	Top-down 或 bottom-up 学习法?

	•	机器学习开发者的现代化路路径:不需要从统计学微积分
开始 

http://www.csdn.net/article/2015-08-27/2825551

https://machinelearningmastery.com/dont-implement-
machine-learning-algorithms/ 

	 •	Coursera 的机器学习课程则偏理理论
参考资料
• 台灣⼤大學 林林軒⽥田 / 機器學習基⽯石、機器學習技術

http://www.csie.ntu.edu.tw/~htlin/mooc/

• 台灣⼤大學 李宏毅 / ⼀一天搞懂深度學習 

https://www.slideshare.net/tw_dsconf/ss-62245351

• edX BerkeleyX: CS190.1x Scalable Machine Learning

• SciRuby Machine Learning Current Status and Future

https://speakerdeck.com/mrkn/sciruby-machine-learning-current-status-and-future

• 李俊良 / Feature Engineering in Machine Learning 

https://www.slideshare.net/tw_dsconf/feature-engineering-in-machine-learning

• Python Machine Learning, Packt Publishing

• Data Science from Scratch, O’Reilly

A brief introduction to Machine Learning