TensorFlowのLinear/DNnRegrressorでデータを予測する

7421 ワード

今日処理する問題は、線形回帰のみを学んだ機械学習初心者にとっては難しい--既知のいくつかのデータのセットを通じてデータのセットを予測する.EXcelで見てみると、関係は明らかではなく、平方、logは明らかではなく、試しても仕方がないので、立ち止まって考えを整理しました.
構想を整理する.
研削時間
  • tensorflow回帰に関するドキュメントチュートリアル
  • udacityのTitanic例
  • たきぎ切り時間
  • python excelテーブルのデータ
  • を読み込む
  • 一次元入力予測出力
  • を試みる.
  • 5 5次元入力予測出力
  • を試みる.
    研削開始
    TensorFlowチュートリアルを読む
    tensor、vector、matrixについて...
    3 # a rank 0 tensor; this is a scalar with shape []
    [1, 2, 3] # a rank 1 tensor; this is a vector with shape[3]
    [[1, 2, 3], [4, 5, 6]] # a rank 2 tensor; this is a matrix with shape [2, 3]
    [[[1, 2, 3]], [[ 7, 8, 9]]] # a rank 3 tensor with shape[2, 1, 3]
    

    上のコードはtensor,vector,matrix,そして様々な場合の[]がどういう意味を表しているのか,つまり私がこれまでやってきた次元をはっきり説明しています.いずれも[]であるが、重要なのはvectorかmatrixか他の3次元4次元の空間記述かであり、光の1つの[]はtensor、[]はrank=1のtensor、[[[[]]はrank=2のtensor、[[[[]]はrank=3のtensorとしか呼ばれない.
    研削ナイフで得られた代替案
  • tf.contrib.learn tf.contrib.learnはTensorFlowの高度なAPIであり、多くの一般的なモデルを定義し、符号化を簡略化することができる.tf.contrib.learn.LinearRegressorこの関数は線形回帰を実現し、同じように他の回帰を実現することができ、APIを見て、logistic regression、linear classification、logistic classification、and many neural network classifieds and regressionsを実現することができることを発見した.これは問題の解決に良い方案を提供して、後で続々と試みることができます.
  • 一昨日習ったばかりの線形回帰時間は十分で、さもなくば最初の1つだけ試してみるといいです.

  • 薪を切り始める
    jupyter notebookで書いたのですが、メリットはセグメント化して実行し、小さなステップで小さなステップテストを書くことです.
    python excelテーブルの読み込み
    この部分は問題の主線ではなく、葛藤しないで、勝手に方法を選んで読めばいいです.先日udacityの最初のプロジェクトをして、csvファイルのデータを読み取るのに使いました.私が取った案はexcelをcsvファイルに変えて、それから読み取ることです.
  • xlsxはcsv
  • として保存されます.
  • は読み取りをテストし、まず最初の行
  • を読み取る.
    import tensorflow as tf
    import numpy as np
    import pandas as pd
    train_data_file = '/Users/liukaixin/ProductDocuments/ShaleGasPressure/train_data.csv'
    predict_data_file = '/Users/liukaixin/ProductDocuments/ShaleGasPressure/predict_data.csv'
    full_train_data = pd.read_csv(train_data_file)
    full_predict_data = pd.read_csv(predict_data_file)
    #                
    print(full_train_data.head())
    #               
    print(full_predict_data.head())
    #        shape
    print(full_train_data.shape)
    #        shape
    print(full_predict_data.shape)
    #   pd.read_csv        
    print(type(full_train_data))
    

    3つの注意点:1、head()関数はデフォルトで最初の5行を返します.2、他の言叶に惯れて、いつも戻り値に関心を持って、pythonがおかしいと感じて、どんなタイプなのか见えないで、パラメータを书く时いつも各种の问题に出会って、仕方なく绝えずタイプを印刷します......pd.read_csv取り戻したのはDataFrameです.3、このDataFrameのshapeは(500,6)、1次元に500個のデータがあり、2次元に6個のデータがあり、6行500列と考えることができますが、行列になりたくないほうがいいと思います.tensorの書き方に変えればいいと思います.データが多次元になると頭が悪くなることがあります.例えば、これ(500,6)をtensorに変えると[[1,2,3,4,5,6],[1,2,4,4,4,5,6],[1,2,3,4,4,5,6],....[1,2,3,4,5,6]]もっと多次元のものにぶつかったらtensorで描けばいい.
  • 予測する列を出力としてデータテーブルから
  • を削除する.
    #            
    train_data_outcomes = train_data['your outcome key']
    #    DataFrame   
    train_data_input = train_data.drop('your outcome key', axis = 1)
    print(train_data_input)
    print(type(train_data_outcomes))
    

    ここでtrain_を印刷data_inputでは出力列がなく,同じ方法で入力データの次元を自由に制御できることが分かった.train_data_outcomesのタイプは
    トレーニング予測と評価
    tfを使用する.contrib.learn.LinearRegressorは1次元入力予測出力を試みます
    一次元入力とは、x=[1,2,3,4,5,…]であり、DataFrameのいずれかの列のみをとり、この列で出力を予測する
    #    ,     
    feature_columns = [tf.contrib.layers.real_valued_column("x", dimension=1)]
    #  LinearRegressor
    estimator = tf.contrib.learn.LinearRegressor(feature_columns=feature_columns)
    input_fn = tf.contrib.learn.io.numpy_input_fn({"x": train_data_input}, train_data_outcomes, batch_size=4,
                                                  num_epochs=1000)
    #   .
    estimator.fit(input_fn=input_fn, steps=1000)
    print(estimator.evaluate(input_fn=input_fn))
    

    最終出力{'loss':xxxx,'global_step':xxxx}
    tfを使用する.contrib.learn.LinearRegressorは5次元入力予測出力を試みた
    5次元に変える最大の問題はinputですfnの1番目のパラメータと2番目のパラメータ(すなわち入力xと出力y)はいったいどんなタイプなのか、上のコードをcopyしてfeature_columnsのdimensionを5に変えてinput_fnのtrain_data_InputをDataFrameに変更すると、次のエラーが発生します.
    AttributeError: 'DataFrame' object has no attribute 'dtype'
    train_のためdata_outcomesはさっきSeriousを見たのですが、[1,2,3,4......]というように成長しているので、DataFrameを[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],...]というように変えたいと思い、私は比較的不器用な方法を使いました.
    k = []
    for i in range(500):
        tmpx = []
        tmpx.append(train_data_input['your first dimension name'][i])
        tmpx.append(train_data_input['your second dimension name'][i])
        tmpx.append(train_data_input['your third dimension name'][i])
        tmpx.append(train_data_input['your fourth dimension name'][i])
        tmpx.append(train_data_input['your fifth dimension name'][i])
        k.append(tmpx)
    print(array_train_data_x)
    

    印刷すると欲しい形になってinput_fnの最初のパラメータには、{「x」:k}(名前が悪い、勝手に起きた、意図を明らかにしていない)がありますが、次のエラーが表示されます.
    AttributeError: 'list' object has no attribute 'shape'
    そこでまた変更して、kの外にnpをセットします.array(k)、やっと運転できるようになりました
    feature_columns = [tf.contrib.layers.real_valued_column("x", dimension=5)]
    estimator = tf.contrib.learn.LinearRegressor(feature_columns=feature_columns)
    input_fn = tf.contrib.learn.io.numpy_input_fn({"x": np.array(k)}, np.array(f), batch_size=4,
                                                  num_epochs=1000)
    estimator.fit(input_fn=input_fn, steps=1000)
    print(estimator.evaluate(input_fn=input_fn))
    

    tfを使用する.contrib.learn.DNnRegressorは5次元入力予測出力を試みる
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=5)]
    classifier = tf.contrib.learn.DNNRegressor(feature_columns=feature_columns,
        hidden_units=[10],
        optimizer=tf.train.RMSPropOptimizer(learning_rate=.001),
        activation_fn=tf.nn.relu)
    classifier.fit(x= train_data_input,
                   y=train_data_outcomes,
                   max_steps=1000)
    print(classifier.evaluate(x= train_data_input, y=train_data_outcomes))
    

    このclassifier.evaluateのパラメータは上記の2つの方法とは異なります.これはinput_がないからです.fn、apiを見ても、タイプが分からないが、私は中の方法を理解して、xとyを定義しなければ、input_が必要だ.fn、定義したらinput_を使わなくてもいいですfnなので、xとyを使ってみましたが、やっぱりいいですね.
    等価コード
    この2つの5次元の発見の同理を書き終わって、LinearRegressionのその5次元のもinputを持たないで書くことができますfnの、fitをxとyに変更し、feature_を指定しないcolumnsのキー値xでいいです.そうしないと、Key Errorと報告されます.これにより、入出力を処理する必要はありませんが、batch_が少なくなります.変更後の同理コードは以下の通りです.
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=5)]
    estimator = tf.contrib.learn.LinearRegressor(feature_columns=feature_columns)
    # input_fn = tf.contrib.learn.io.numpy_input_fn({"x": np.array(k)}, train_data_outcomes, batch_size=4,
    #                                              num_epochs=3000)
    # estimator.fit(input_fn=input_fn, steps=3000)
    estimator.fit(x= train_data_input,y=train_data_outcomes, batch_size=4,steps=3000)
    print(estimator.evaluate(x= train_data_input,y=train_data_outcomes))
    

    問題
    APIの不慣れさとPythonの不慣れさのため、上記のものはまる2日間やって、また次の2つの疑問を残して、今後の学習の中で次第に補充することができて、しかしもしできる同級生が3つの言葉で1つ2つのことを指摘することができたら感謝に堪えません.
  • 精度はどのように私がlossの値に関心を持っていないことを評価して、私はそれが1つの正解率を出力することができることを望んで、点数あるいは小数はすべてできますが、私は最も愚かな方法で、出力と真実の出力をプログラムで1回比べて、しかし私はevaluateが直接出力する仕事の能力があることを発見したようで、しかし使うことができなくて、できる学友の指導の下で望みます.
  • 予測方法
  • 予測方法を見つけた
    print(estimator.predict(x= train_data_input))
    print(type(estimator.predict(x= train_data_input)))
    

    この方法は1つ得て、私はその値がどれらがあるかを見て、それをlistに変えなければなりません.こんなに面倒ですか?generateタイプにはどのようなメリットがありますか?なぜこのタイプのオブジェクトを返すのですか?