原文地址:這裏python
Google最近開源了機器學習框架TensorFlow,在很短的時間內就在Github上得到了超過的10K的贊,而且在AI研究者之間引起了很大的反響。linux
在瞭解TensorFlow以前,咱們首先要搞明白一個問題。做爲一個專業的數據科學家,爲何在有了大量現存的數據科學或者機器學習的工具(譬如R,SciKit Learn)以後,還須要關注其餘的機器學習框架,筆者竊覺得有如下兩點:git
TensorFlow中的深度學習部分容許使用者將多個不一樣的模型或者轉化結合到一個模型中,而且同時訓練它們。根據TensorFlow設定的不一樣的OP,你能夠同時處理文本、圖片和其餘的常規的類別或者連續變量。開發者能夠方便地同時進行多目標或者多損失函數的訓練,而其餘不少的機器學習框架並不能在傳統的模型創建時候作到這一點。github
TensorFlow中的管道處理方式會成爲數據處理的很重要的一個角色。將來,數據處理與機器學習將會在一個框架中同時進行,而TensorFlow正是在向這個方向前行。api
這裏咱們以 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_examplesdom
首先咱們來看下數據的格式:機器學習
>>> 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封裝了不少的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)