TensorFlow實戰之Scikit Flow系列指導:Part 1
原文地址: 這里
Google最近開源了機器學習框架TensorFlow,在很短的時間內就在Github上獲得了超過的10K的贊,并且在AI研究者之間引發了很大的反響。
Why do I care?
在了解TensorFlow之前,我們首先要搞明白一個問題。作為一個專業的數據科學家,為什么在有了大量現存的數據科學或者機器學習的工具(譬如R,SciKit Learn)之后,還需要關注其他的機器學習框架,筆者竊以為有以下兩點:
-
TensorFlow中的深度學習部分允許使用者將多個不同的模型或者轉化結合到一個模型中,并且同時訓練它們。根據TensorFlow設定的不同的OP,你可以同時處理文本、圖片和其他的常規的類別或者連續變量。開發者可以方便地同時進行多目標或者多損失函數的訓練,而其他很多的機器學習框架并不能在傳統的模型建立時候做到這一點。
</li> -
TensorFlow中的管道處理方式會成為數據處理的很重要的一個角色。未來,數據處理與機器學習將會在一個框架中同時進行,而TensorFlow正是在向這個方向前行。
</li> </ul>基于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)
-