原文地址:这里
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)