2016-10-17 3 views
-2

끝없는 인터넷 검색은 나를 파이썬에 대해 더 잘 교육 받고 질책을 느끼게했지만 여전히 내 작업을 해결하는 데는 단서가 없습니다. 정수/부동 소수점 값의 CSV를 읽고 신경망을 사용하여 값을 예측하고 싶습니다. 아이리스 데이터 집합을 읽고 분류를하는 몇 가지 예를 발견했지만 회귀 분석을 위해 어떻게 작동하는지 이해하지 못합니다. 누군가 내가 점들을 연결하도록 도울 수 있습니까? 925 개 값이어야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

:

여기에 입력 한 선이다. 마지막 열은 출력입니다. 첫 번째는 RowID입니다. 이미 하나의 핫 인코딩을했기 때문에 대부분 이진 값입니다. 테스트 파일에는 출력/마지막 열이 없습니다. 전체 교육 파일에는 약 10 백만 개의 행이 있습니다. 일반적인 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를 이해하지 못하고 설명서에서 데이터 유형을 알지 못합니다.

#!/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 

그리고 여기 내가 사용하고자하는 기본 코드입니다 : 여기

내가 그 두 ndarrays으로 CSV를 읽고있는 최신 코드입니다. 이 예가 나온 것도 아니 었습니다. 아래의 링크에있는 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으로 작업하기가 상대적으로 쉽습니다. skflowtensorflow보다 훨씬 높은 수준이며 거의 동일한 api를 가지고 있습니다. sklearn입니다.이제 대답

    : 회귀 예를 들어

    , 우리는 홍채 데이터 세트에 대한 회귀 분석을 수행 할 수 있습니다. 이제 이것은 어리석은 아이디어이지만 DNNRegressor을 사용하는 방법을 보여줄뿐입니다.

    Skflow의 API

    새 API를 처음 사용할 때, 가능한 한 적은 수의 매개 변수를 사용하려고합니다. 당신은 단지 뭔가를 얻고 싶습니다. 그래서,이 같은 DNNRegressor을 설정할 수 있습니다 제안 :

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

    은 내가 지금 많은 연산 능력이 없기 때문에 내 # 숨겨진 단위를 작게 유지. 그런 다음

    당신은 그것을 학습 데이터, train_X을주고, 교육 train_y 레이블을 다음과 같이 당신은 그것을 맞게 :

    estimator.fit(train_X, train_y) 
    

    이 단지로 tensorflow를 확장 모든 sklearn 분류 및 회귀와 skflow에 대한 표준 절차 sklearn와 유사합니다. 또한 매개 변수를 steps = 10으로 설정하여 학습이 10 회 반복 실행될 때 더 빨리 완료되도록합니다.

    pred = estimator.predict(test_X) 
    

    을 다시 말하지만,이 모든 sklearn 코드에 대한 표준 절차입니다 : 이제

    , 당신이 몇 가지 새로운 데이터 test_X에 예측하려면, 다음과 같이 그렇게. 그래서 그게 - skflow 그래서 당신은 그 세 줄이 필요 단순화 된이야!

    train_X 및 train_y의 형식은 무엇입니까?

    기계 학습에 익숙하지 않은 경우 일반적으로 훈련 데이터는 크기 M x d 인 ndarray (행렬)이며 M 실습 예제 및 d 피쳐가 있습니다. 귀하의 레이블은 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 x 매트릭스입니다. 테스트 예제에는 모두 d 개 기능이 있어야합니다. 예측 함수는 테스트 데이터를 가져 와서 N x 1 모양의 테스트 라벨을 반환합니다 (모양의 (N,))

    당신은 .csv 파일을 제공하지 않았으므로 데이터를 구문 분석하도록 할 것입니다. 그 형식. 편리하게도 sklearn.datsets.load_iris()을 사용하면 Xy을 얻을 수 있습니다. 그것은 당신의 DNNRegressor의 출력은 실수 (같은이 1.6789)의 무리가 될 것입니다 분류

    로 회귀 변수를 사용하여 단지

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

    입니다. 그러나 홍채 데이터 세트에는 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의 현재 버전에는 기능 컬럼이 필요합니다. 역 추적 (마지막으로 가장 최근 통화) : 나는이 오류가있어 추정 = skflow.DNNRegressor에 파일 "iris_regression.py", 라인 (12), (hidden_units =은 [16, 16]) 형식 오류 : __init의 __은()에 소요 최소한 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)) 
    
    관련 문제