Использовать атрибутные и целевые матрицы для линейной регрессии TensorFlow Python

Я пытаюсь выполнить этот учебник.

TensorFlow только что вышел, и я действительно пытаюсь это понять. Я знаком с оштрафованной линейной регрессией, такой как Lasso, Ridge и ElasticNet, и ее использованием в scikit-learn.

Для scikit-learn регрессии Lasso все, что мне нужно ввести в алгоритм регрессии, - это DF_X [матрица атрибутов M x N (pd.DataFrame)] и SR_y [размерный целевой вектор M (pd. Серии)]. Структура Variable в TensorFlow для меня немного нова, и я не уверен, как структурировать свои входные данные в то, что она хочет.

Кажется, что регрессия softmax относится к классификации. Как я могу реструктурировать мою матрицу атрибутов DF_X (M x N) и SR_y (размерный целевой вектор M) для ввода в tensorflow для линейной регрессии?

Мой текущий метод для линейной регрессии использует pandas, numpy и sklearn, и это показано ниже. Я думаю, что этот вопрос будет действительно полезен для людей, знакомых с TensorFlow:

#!/usr/bin/python
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.linear_model import LassoCV

#Create DataFrames for attribute and target matrices
DF_X = pd.DataFrame(np.array([[0,0,1],[2,3,1],[4,5,1],[3,4,1]]),columns=["att1","att2","att3"],index=["s1","s2","s3","s4"])
SR_y = pd.Series(np.array([3,2,5,8]),index=["s1","s2","s3","s4"],name="target")

print DF_X
#att1  att2  att3
#s1     0     0     1
#s2     2     3     1
#s3     4     5     1
#s4     3     4     1

print SR_y
#s1    3
#s2    2
#s3    5
#s4    8
#Name: target, dtype: int64

#Create Linear Model (Lasso Regression)
model = LassoCV()
model.fit(DF_X,SR_y)

print model
#LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,
#max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False,
#precompute='auto', random_state=None, selection='cyclic', tol=0.0001,
#verbose=False)

print model.coef_
#[ 0.         0.3833346  0.       ]

Ответы

Ответ 1

Softmax - единственная функция добавления (например, в логистической регрессии), это не такая модель, как

model = LassoCV()
model.fit(DF_X,SR_y)

Поэтому вы не можете просто предоставить данные с помощью метода fit. Однако вы можете просто создать свою модель с помощью функций TensorFlow.

Прежде всего, вам нужно создать вычислительный граф, например, для линейной регрессии вы создадите тензоры с размером ваших данных. Они являются только тензорами, и вы передадите их в массив в другой части программы.

import tensorflow as tf
x = tf.placeholder("float", [4, 3])      
y_ = tf.placeholder("float",[4])

При создании двух переменных, которые будут содержать начальные веса нашей модели

W = tf.Variable(tf.zeros([3,1]))
b = tf.Variable(tf.zeros([1]))

И теперь вы можете создать модель (вы хотите создать регрессию, а не классифицировать, поэтому вам не нужно использовать tf.nn.softmax)

y=tf.matmul(x,W) + b

Поскольку у вас есть регрессия и линейная модель, вы будете использовать

loss=tf.reduce_sum(tf.square(y_ - y))

Затем мы будем тренировать нашу модель с тем же шагом, что и в учебнике

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

Теперь, когда вы создали вычислительный граф, вам нужно написать еще одну часть программы, где вы будете использовать этот график для работы с вашими данными.

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)       
sess.run(train_step, feed_dict={x:np.asarray(DF_X),y_:np.asarray(SR_y)})

Здесь вы даете свои данные на этот вычислительный граф с помощью feed_dict. В TensorFlow вы предоставляете информацию в массивах numpy. Если вы хотите увидеть свою ошибку, вы можете написать

sess.run(loss,feed_dict={x:np.asarray(DF_X),y_:np.asarray(SR_y)})