2016-10-17 5 views
-2

エンドレスグーグルでは、私がPythonとnumpyの知識を身につけてくれましたが、私の仕事を解決するにはまだまだです。私は、整数/浮動小数点値のCSVを読み込み、ニューラルネットワークを使って値を予測したいと思います。私はアイリスのデータセットを読み、分類を行ういくつかの例を見つけましたが、それらを回帰のために働かせる方法を理解していません。誰かがドットを結ぶのを助けることができますか?CSV >> Tensorflow >>回帰(ニューラルネットワーク経由)

16804,0,1,0,1,1,0,1,0,1,0,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.490265,0.620805,0.54977,0.869299,0.422268,0.351223,0.33572,0.68308,0.40455,0.47779,0.307628,0.301921,0.318646,0.365993,6135.81

925個の値であるべきである:ここ

は、入力の一つの行です。最後の列は出力です。最初はRowIDです。私はすでにワンホットエンコーディングを行っているので、ほとんどがバイナリ値です。テストファイルに出力/最終列はありません。完全なトレーニングファイルには、約10Mの行があります。一般的なMxNソリューションが実現します。

編集:アイリスは分類の問題であるため、このサンプルデータを使用してみましょうが、上記は私の本当の目標です。 ID列を削除しました。 6つの他の列が与えられた最後の列を予測しましょう。これには45行あります。 (SRC:http://www.stat.ufl.edu/~winner/data/civwar2.dat

100,1861,5,2,3,5,38 112,1863,11,7,4,59.82,15.18 113,1862,34,32,1,79.65,2.65 90,1862,5,2,3,68.89,5.56 93,1862,14,10,4,61.29,17.2 179,1862,22,19,3,62.01,8.89 99,1861,22,16,6,67.68,27.27 111,1862,16,11,4,78.38,8.11 107,1863,17,11,5,60.75,5.61 156,1862,32,30,2,60.9,12.82 152,1862,23,21,2,73.55,6.41 72,1863,7,3,3,54.17,20.83 134,1862,22,21,1,67.91,9.7 180,1862,23,16,4,69.44,3.89 143,1863,23,19,4,81.12,8.39 110,1862,16,12,2,31.82,9.09 157,1862,15,10,5,52.23,24.84 101,1863,4,1,3,58.42,18.81 115,1862,14,11,3,86.96,5.22 103,1862,7,6,1,70.87,0 90,1862,11,11,0,70,4.44 105,1862,20,17,3,80,4.76 104,1862,11,9,1,29.81,9.62 102,1862,17,10,7,49.02,6.86 112,1862,19,14,5,26.79,14.29 87,1862,6,3,3,8.05,72.41 92,1862,4,3,0,11.96,86.96 108,1862,12,7,3,16.67,25 86,1864,0,0,0,2.33,11.63 82,1864,4,3,1,81.71,8.54 76,1864,1,0,1,48.68,6.58 79,1864,0,0,0,15.19,21.52 85,1864,1,1,0,89.41,3.53 85,1864,1,1,0,56.47,0 85,1864,0,0,0,31.76,15.29 87,1864,6,5,0,81.61,3.45 85,1864,5,5,0,72.94,0 83,1864,0,0,0,46.99,2.38 101,1864,5,5,0,1.98,95.05 99,1864,6,6,0,42.42,9.09 10,1864,0,0,0,50,9 98,1864,6,6,0,79.59,3.06 10,1864,0,0,0,71,9 78,1864,5,5,0,70.51,1.28 89,1864,4,4,0,59.55,13.48

私は、これは一般的な作業ですが、私は、私はこれを求めてきましたので、読んで任意のフォーラムで回答されていないように見えることを追加してみましょう。私はあなたに私の壊れたコードを与えることができますが、私は機能的に正しいコードであなたの時間を無駄にしたくありません。申し訳ありませんが、私はこのように尋ねました。私はAPIを理解しておらず、ドキュメントはデータ型を教えてくれません。ここで

は、私はそれを持っている最新のコードである2 ndarraysにCSVを読み込む:

#!/usr/bin/env python 
import tensorflow as tf 
import csv 
import numpy as np 
from numpy import genfromtxt 

# Build Example Data is CSV format, but use Iris data 
from sklearn import datasets 
from sklearn.cross_validation import train_test_split 
import sklearn 
def buildDataFromIris(): 
    iris = datasets.load_iris() 
    data = np.loadtxt(open("t100.csv.out","rb"),delimiter=",",skiprows=0) 
    labels = np.copy(data) 
    labels = labels[:,924] 
    print "labels: ", type (labels), labels.shape, labels.ndim 
    data = np.delete(data, [924], axis=1) 
    print "data: ", type (data), data.shape, data.ndim 

そして、ここでは、私が使用したいベースコードです。この例は完全ではありませんでした。以下のリンクのAPIはあいまいです。少なくとも、DNNRegressorと他のドキュメントに入力されたデータ型をドキュメントで把握できれば、カスタムコードを書くことができるかもしれません。

estimator = DNNRegressor(
    feature_columns=[education_emb, occupation_emb], 
    hidden_units=[1024, 512, 256]) 

# Or estimator using the ProximalAdagradOptimizer optimizer with 
# regularization. 
estimator = DNNRegressor(
    feature_columns=[education_emb, occupation_emb], 
    hidden_units=[1024, 512, 256], 
    optimizer=tf.train.ProximalAdagradOptimizer(
     learning_rate=0.1, 
     l1_regularization_strength=0.001 
    )) 

# Input builders 
def input_fn_train: # returns x, Y 
    pass 
estimator.fit(input_fn=input_fn_train) 

def input_fn_eval: # returns x, Y 
    pass 
estimator.evaluate(input_fn=input_fn_eval) 
estimator.predict(x=x) 

そして、大きな問題は、これらを一緒に働かせることです。

ここで私が見てきたいくつかのページがあります。 https://www.tensorflow.org/versions/r0.11/tutorials/tflearn/index.html

  • 回帰:CSVと作品(クラシファイア)を読み出す

  • +1

    問題の説明を絞り込むことはできますか?現在の問題は、(1)ワンホットフォーマットでCSVファイルを取り込む方法、 (2)厳密な分類(列挙型)から採点(CSV行の最後の浮動小数点値)に切り替える方法。 – Prune

    +0

    あなたは変換の試みとその結果(出力の欠如)を投稿できますか?それは私たちに攻撃の焦点をもっと絞ることになります。 – Prune

    +1

    私は本質的にCSVを読むことができるので範囲を単純化しましたが、希望の形式でNNに入力する方法はわかりません。 – ldmtwo

    答えて

    3

    私も過去に把握する低レベルTensorflowはかなり難しいことがわかりました。そしてその文書は驚くべきものではありません。代わりにsklearnのハングを取得することに焦点を当てている場合は、skflowで作業するのは比較的簡単です。 skflowは、tensorflowよりはるかに高いレベルにあり、ほぼ同じapiを持っています。sklearnです。その答えに今

    :回帰例として

    、私たちは、虹彩データセットに回帰を実行します。これはばかげたアイデアですが、DNNRegressorの使い方をデモするだけです。

    SkflowのAPI

    新しいAPIを初めて使用するときは、できるだけ少数のパラメータとして使用するようにしてください。あなたはただ何かを働かせたいだけです。だから、私はあなたがこのようなDNNRegressorを設定することができます提案:

    estimator = skflow.DNNRegressor(hidden_units=[16, 16]) 
    

    私は今、多くの計算能力を持っていないので、私は小さな私の#隠れユニットを保ちました。

    次に、あなたがtrain_X、それをトレーニングデータを与え、訓練ラベルtrain_yと次のようにあなたはそれに合う:

    estimator.fit(train_X, train_y) 
    

    これは、すべてのsklearn分類と説明変数とskflowのための標準的な手順だけであることをtensorflowを拡張していますsklearnに似ています。また、パラメータがsteps = 10に設定されているため、トレーニングが10回だけ実行された場合にトレーニングがより高速に終了します。

    pred = estimator.predict(test_X) 
    

    を繰り返しますが、これはすべてのsklearnコードの標準的な手順です:今

    、あなたはそれがいくつかの新しいデータ、test_Xに予測したい場合は、次のようにそれを行います。だからそれは - skflowはとても簡素化されているだけで、それらの3つのラインが必要です!

    train_Xとtrain_yの形式は何ですか?

    機械学習にあまり慣れていない場合は、トレーニングデータはM練習例とd個のフィーチャーがある場合、一般にM×dサイズのndarray(マトリックス)です。あなたのラベルはM x 1です(ndarray、形は(M,))。

    Features: Sepal Width Sepal Length ...    Labels 
          [ 5.1   2.5    ]   [0 (setosa)  ] 
        X =  [ 2.3   2.4    ]  y = [1 (virginica) ] 
          [ ...    ...   ]   [ ....  ] 
          [ 1.3   4.5    ]   [2 (Versicolour)] 
    

    (私はちょうどすべてのそれらの数字を作っ注意してください):

    だから、あなたが持っているもの、このようなものです。

    テストデータはN個のテスト例があるN×Dマトリックスになります。テスト例にはすべてd個のフィーチャが必要です。予測関数はテストデータを取り込み、形状N x 1のテストラベルを返します(形の(N,)

    あなたは.csvファイルを提供していないので、データを解析してそのフォーマット。便利ですが、sklearn.datsets.load_iris()を使用して、Xyを取得することができます。それはちょうど

    iris = datasets.load_iris() 
    X = iris.data 
    y = iris.target 
    

    あなたDNNRegressorの出力は(1.6789のような)実数の束になりますクラシ

    として回帰を使用します。しかし、虹彩データセットには0,1,2というラベルが付いています。これは、Setosa、Versicolour、およびVirginiaの整数IDです。このリグレッサーで分類を実行するには、最も近いラベル(0,1,2)に丸めます。例えば、1.6789の予測は、私が働い例で最も学ぶ見つける

    実施例

    2に丸めます。そこでここでは非常に単純化された作業例です:

    enter image description here

    はコメントとして任意の更なる質問を投稿してお気軽に。

    +0

    応答と完全な例を提供していただきありがとうございます。小さなサンプル回帰データを追加しました。その間、私はこれをテストします。また、これらのデータ構造を使用できないため、サンプルデータをロードする関数でTFのビルドを使用することは避けようとしています。入力はnumpy配列、テキストまたはバイナリファイルから開始する必要があります。私は現在、CSVをNDArrayに読み込む方法を考え出しました。 「X = iris.data」がNDArrayであると仮定できますか? – ldmtwo

    +0

    私はそれがndarrayだと確信しています。 'print type(X)'で確認することができます – user2570465

    +0

    現在のバージョンのTFにはフィーチャーカラムが必要です。 トレースバック(最新の呼び出しの最後):__init __()になります:= skflow.DNNRegressor(hidden_​​units = [16,16]) 例外TypeErrorが 推定で ファイル "iris_regression.py"、12行目、私はこのエラーを得ました少なくとも3つの引数(2与えられます) – ldmtwo

    0

    私はいくつかのオプションで終わった。なぜ起きて走るのが難しいのか分かりません。まず、@ user2570465に基づくコードを示します。

    import tensorflow as tf 
    import numpy as np 
    from sklearn import datasets 
    from sklearn.model_selection import train_test_split 
    import tensorflow.contrib.learn as skflow 
    
    def buildDataFromIris(): 
        iris = datasets.load_iris() 
        return iris.data, iris.target 
    
    X, y = buildDataFromIris() 
    feature_cols = tf.contrib.learn.infer_real_valued_columns_from_input(X) 
    estimator = skflow.DNNRegressor(feature_columns=feature_cols, hidden_units=[10, 10]) 
    train_X, test_X, train_y, test_y = train_test_split(X, y) 
    estimator.fit(X, y, steps=10) 
    
    test_preds = estimator.predict(test_X) 
    
    def CalculateAccuracy(X, y): 
        continuous_predictions = estimator.predict(X) 
        closest_class = [] 
        for pred in continuous_predictions: 
         differences = np.array([abs(pred-1), abs(pred-1), abs(pred-1)]) 
         closest_class.append(np.argmin(differences)) 
    
        num_correct = np.sum(closest_class == y) 
        accuracy = float(num_correct)/len(y) 
        return accuracy 
    
    train_accuracy = CalculateAccuracy(train_X, train_y) 
    test_accuracy = CalculateAccuracy(test_X, test_y) 
    
    print("Train accuracy: %f" % train_accuracy) 
    print("Test accuracy: %f" % test_accuracy) 
    

    他のソリューションでは、小さなコンポーネントからモデルを構築しました。ここでは、Sig(X * W1 + b1)* W2 + b2 = Yを計算するスニペットを示します。Optimizer = Adam、loss = L2、eval = L2、MSE。

    x_train = X[:train_size] 
    y_train = Y[:train_size] 
    x_val = X[train_size:] 
    y_val = Y[train_size:] 
    print("x_train: {}".format(x_train.shape)) 
    
    x_train = all_x[:train_size] 
    print("x_train: {}".format(x_train.shape)) 
    # y_train = func(x_train) 
    # x_val = all_x[train_size:] 
    # y_val = func(x_val) 
    
    # plt.figure(1) 
    # plt.scatter(x_train, y_train, c='blue', label='train') 
    # plt.scatter(x_val, y_val, c='red', label='validation') 
    # plt.legend() 
    # plt.savefig("../img/nn_mlp1.png") 
    
    
    #build the model 
    """ 
    X = [ 
    """ 
    X = tf.placeholder(tf.float32, [None, n_input], name = 'X') 
    Y = tf.placeholder(tf.float32, [None, n_output], name = 'Y') 
    
    w_h = tf.Variable(tf.random_uniform([n_input, layer1_neurons], minval=-1, maxval=1, dtype=tf.float32)) 
    b_h = tf.Variable(tf.zeros([1, layer1_neurons], dtype=tf.float32)) 
    h = tf.nn.sigmoid(tf.matmul(X, w_h) + b_h) 
    
    w_o = tf.Variable(tf.random_uniform([layer1_neurons, 1], minval=-1, maxval=1, dtype=tf.float32)) 
    b_o = tf.Variable(tf.zeros([1, 1], dtype=tf.float32)) 
    model = tf.matmul(h, w_o) + b_o 
    
    train_op = tf.train.AdamOptimizer().minimize(tf.nn.l2_loss(model - Y)) 
    tf.nn.l2_loss(model - Y) 
    
    #output = sum((model - Y) ** 2)/2 
    output = tf.reduce_sum(tf.square(model - Y))/2 
    
    #launch the session 
    sess = tf.Session() 
    sess.run(tf.initialize_all_variables()) 
    
    errors = [] 
    for i in range(numEpochs): 
        for start, end in zip(range(0, len(x_train), batchSize), range(batchSize, len(x_train), batchSize)): 
         sess.run(train_op, feed_dict={X: x_train[start:end], Y: y_train[start:end]}) 
        cost = sess.run(tf.nn.l2_loss(model - y_val), feed_dict={X: x_val}) 
        errors.append(cost) 
        if i%100 == 0: print("epoch %d, cost = %g" % (i,cost)) 
    
    関連する問題