原文地址:這裡
Google最近開源了機器學習框架TensorFlow,在很短的時間內就在Github上獲得了超過的10K的贊,並且在AI研究者之間引發了很大的反響。
Why do I care?
在瞭解TensorFlow之前,我們首先要搞明白一個問題。作為一個專業的資料科學家,為什麼在有了大量現存的資料科學或者機器學習的工具(譬如R,SciKit Learn)之後,還需要關注其他的機器學習框架,筆者竊以為有以下兩點:
-
TensorFlow中的深度學習部分允許使用者將多個不同的模型或者轉化結合到一個模型中,並且同時訓練它們。根據TensorFlow設定的不同的OP,你可以同時處理文字、圖片和其他的常規的類別或者連續變數。開發者可以方便地同時進行多目標或者多損失函式的訓練,而其他很多的機器學習框架並不能在傳統的模型建立時候做到這一點。
-
TensorFlow中的管道處理方式會成為資料處理的很重要的一個角色。未來,資料處理與機器學習將會在一個框架中同時進行,而TensorFlow正是在向這個方向前行。
基於Titanic資料集的簡單模型
這裡我們以 Scikit Flow為例,scflow是Google官方提供的基於scikit api的對於TensorFlow的封裝,整個開發環境安裝如下:
pip install numpy scipy sklearn pandas
# For Ubuntu:
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
# For Mac:
pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
pip install git+git://github.com/google/skflow.git
完整的資料集合和程式碼在這裡:http://github.com/ilblackdragon/tf_examples
首先我們來看下資料的格式:
>>> import pandas
>>> data = pandas.read_csv(`data/train.csv`)
>>> data.shape
(891, 12)
>>> data.columns
Index([u`PassengerId`, u`Survived`, u`Pclass`, u`Name`, u`Sex`, u`Age`,
u`SibSp`, u`Parch`, u`Ticket`, u`Fare`, u`Cabin`, u`Embarked`],
dtype=`object`)
>>> data[:1]
PassengerId Survived Pclass Name Sex Age SibSp
0 1 0 3 Braund, Mr. Owen Harris male 22 1
Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.25 NaN S
下面我們首先用Scikit 中提供的LogisticRegression來判斷下Survived的類別:
>>> y, X = train[`Survived`], train[[`Age`, `SibSp`, `Fare`]].fillna(0)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
>>> lr = LogisticRegression()
>>> lr.fit(X_train, y_train)
>>> print accuracy_score(lr.predict(X_test), y_test)
0.664804469274
在程式碼中我們將資料集分為了特徵與目標兩個屬性,並且將所有的N/A資料設定為了0,並建立了一個Logistic迴歸。並且最後對該模型的準確率進行了一個檢測。接下來,我們嘗試使用Scikit Flow的類似的介面:
>>> import skflow
>>> import random
>>> random.seed(42) # to sample data the same way
>>> classifier = skflow.TensorFlowLinearClassifier(n_classes=2, batch_size=128, steps=500, learning_rate=0.05)
>>> classifier.fit(X_train, y_train)
>>> print accuracy_score(classifier.predict(X_test), y_test)
0.68156424581
Scikit Flow
Scikit Flow封裝了很多的TensorFlow的最新的API,並且將它們封裝成了很類似於Scikit Learn API的樣式。TensorFlow的核心即是基於構建與執行某個圖,這是一個非常棒,但也是非常難以直接上手的概念。如果我們看Scikit Flow的底層封裝,我們可以看到整個模型被分為了以下幾個部分:
-
TensorFlowTrainer — 用於尋找所有優化器的類(使用梯度進行了部分的圖構建,進行了一些梯度裁剪並且新增一些優化器)
-
logistic_regression —用於構造Logistic迴歸圖的函式
-
linear_regression — 用於構造線性迴歸圖的函式
-
DataFeeder — 用於將訓練資料填充到模型中 (由於TensorFlow使用了資料集合中的隨機的一些部分作為隨機梯度下降的資料,因此需要這樣的Mini資料批處理)。
-
TensorFlowLinearClassifier — 用LogisticRegression 模型實現了 Scikit Learn提供的某個介面。它提供了一個模型和一個訓練器,並且根據給定的資料集合利用fit()方法進行資料訓練,並且通過predict()方法進行預測。
-
TensorFlowLinearRegressor — 類似於 TensorFlowClassifier, 但是使用LinearRegression 作為模型。
如果你本身對於TensorFlow就已經很熟悉了,那麼Scikit Flow會更加的易於上手。
完整的程式碼列舉如下:
import random
import pandas
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.utils import check_array
from sklearn.cross_validation import train_test_split
import tensorflow as tf
import skflow
train = pandas.read_csv(`data/titanic_train.csv`)
y, X = train[`Survived`], train[[`Age`, `SibSp`, `Fare`]].fillna(0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
lr = LogisticRegression()
lr.fit(X_train, y_train)
print accuracy_score(lr.predict(X_test), y_test)
# Linear classifier.
random.seed(42)
tflr = skflow.TensorFlowLinearClassifier(n_classes=2, batch_size=128,
steps=500, learning_rate=0.05)
tflr.fit(X_train, y_train)
print accuracy_score(tflr.predict(X_test), y_test)
# 3 layer neural network with rectified linear activation.
random.seed(42)
classifier = skflow.TensorFlowDNNClassifier(hidden_units=[10, 20, 10],
n_classes=2, batch_size=128, steps=500, learning_rate=0.05)
classifier.fit(X_train, y_train)
print accuracy_score(classifier.predict(X_test), y_test)
# 3 layer neural network with hyperbolic tangent activation.
def dnn_tanh(X, y):
layers = skflow.ops.dnn(X, [10, 20, 10], tf.tanh)
return skflow.models.logistic_regression(layers, y)
random.seed(42)
classifier = skflow.TensorFlowEstimator(model_fn=dnn_tanh,
n_classes=2, batch_size=128, steps=500, learning_rate=0.05)
classifier.fit(X_train, y_train)
print accuracy_score(classifier.predict(X_test), y_test)