TensorFlow實戰之Scikit Flow系列指導:Part 1

jopen 9年前發布 | 58K 次閱讀 機器學習 TensorFlow

原文地址: 這里

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)
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!