我正在尝试从这个链接提供的CSV数据中获取非线性回归:CSV数据
我想使用多项式回归。问题是我从TensorFlow得到的结果是“None”。我找不到问题所在。我认为可能是模型或成本函数出了问题。有人能帮我吗?任何帮助都将不胜感激。
# 导入模块import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport csvimport time# 定义获取数据的方法# date_idx 是CSV文件中日期的列号def read(filename, date_idx, date_parse, year, bucket=7): # 一年中的天数:365天 days_in_year = 365 # 定义频率字典 freq = {} # 这里我们计算每个频率有多少个桶? # 桶数为7,即每个频率为7天 # 我们将每个频率初始化为零 for period in range(0, int(days_in_year / bucket)): freq[period] = 0 # 以二进制模式打开文件('rb' : 'r'表示读取,'b'表示二进制模式) with open(filename, 'r') as csvfile: csvreader = csv.reader(csvfile) next(csvreader) # 跳过第一行,因为它只包含标题 for row in csvreader: if row[date_idx] == '': # 每行包含许多列,但如果日期不可用 continue # 则无需检查数据 t = time.strptime(row[date_idx], date_parse) # 转换为输入格式 if t.tm_year == year and t.tm_yday < (days_in_year-1): # 我们想要特定年份的数据 freq[int(t.tm_yday / bucket)] += 1 # 查找频率 return freq# 这里我调用方法来为我收集数据freq = read(r'C:\My Files\Programming\Python\TensorFlow\CallCenter\311_Call_Center_Tracking_Data__Archived_.csv', 0, '%m/%d/%Y', 2014)# 这里我们将字典转换为Python中的两个数组或列表x_temp =[]y_temp =[]for key, value in freq.items(): x_temp.append(key) y_temp.append(value)x_data = np.asarray(x_temp)y_data = np.asarray(y_temp)# 可视化数据plt.scatter(x_data,y_data)plt.show()# 将数据按比例分成两组:训练和测试def split_dataset(x_dataset, y_dataset, ratio): arr = np.arange(x_dataset.size) np.random.shuffle(arr) num_train = int(ratio*x_dataset.size) x_train = x_dataset[arr[0:num_train]] y_train = y_dataset[arr[0:num_train]] x_test = x_dataset[arr[num_train:x_dataset.size]] y_test = y_dataset[arr[num_train:y_dataset.size]] return x_train,y_train,x_test,y_testx_train, y_train, x_test, y_test = split_dataset(x_data,y_data, ratio=0.7)# 这里我们为会话的输入和输出创建一些占位符X = tf.placeholder(tf.float32)Y = tf.placeholder(tf.float32)# 定义全局变量learning_rate = 0.01training_epochs = 100num_coeffs = 5# 添加正则化(供以后使用)#reg_lambda = 0.# 定义多项式的系数w = tf.Variable([0.]*num_coeffs, name='parameter')# 定义模型def model(X,w): terms = [] for i in range(num_coeffs): term = tf.multiply(w[i], tf.pow(X, i)) terms.append(term) return tf.add_n(terms)y_model = model(X,w)# 定义成本函数cost = tf.reduce_sum(tf.pow(Y-y_model,2))# 定义训练方法train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)# 初始化所有变量init = tf.global_variables_initializer()#运行模型with tf.Session() as sess: sess.run(init) for epoch in range(training_epochs): training_cost = sess.run(train_op, feed_dict={X:x_train, Y:y_train}) print(training_cost) final_cost = sess.run(cost,feed_dict={X: x_test, Y:y_test}) print('最终成本 = {}'.format(training_cost))
回答:
我刚刚按照如下方式更改了代码。现在代码可以工作了,但结果仍然有些偏差,我认为在模型定义上还需要进一步优化。感谢@gcucurull的帮助,我才得以解决这个问题。
# 导入模块import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport csvimport time# 定义获取数据的方法# date_idx 是CSV文件中日期的列号from pylint.checkers.raw_metrics import get_typedef read(filename, date_idx, date_parse, year, bucket=7): # 一年中的天数:365天 days_in_year = 365 # 定义频率字典 freq = {} # 这里我们计算每个频率有多少个桶? # 桶数为7,即每个频率为7天 # 我们将每个频率初始化为零 for period in range(0, int(days_in_year / bucket)): freq[period] = 0 # 以二进制模式打开文件('rb' : 'r'表示读取,'b'表示二进制模式) with open(filename, 'r') as csvfile: csvreader = csv.reader(csvfile) next(csvreader) # 跳过第一行,因为它只包含标题 for row in csvreader: if row[date_idx] == '': # 每行包含许多列,但如果日期不可用 continue # 则无需检查数据 t = time.strptime(row[date_idx], date_parse) # 转换为输入格式 if t.tm_year == year and t.tm_yday < (days_in_year-1): # 我们想要特定年份的数据 freq[int(t.tm_yday / bucket)] += 1 # 查找频率 return freq# 这里我调用方法来为我收集数据freq = read(r'C:\My Files\Programming\Python\TensorFlow\CallCenter\311_Call_Center_Tracking_Data__Archived_.csv', 0, '%m/%d/%Y', 2014)# 这里我们将字典转换为Python中的两个数组或列表x_temp =[]y_temp =[]for key, value in freq.items(): x_temp.append(key) y_temp.append(value)x_data = np.asarray(x_temp)x_data = x_data.astype(float)y_data = np.asarray(y_temp)y_data = y_data.astype(float)print(x_data)print(y_data)# 可视化数据#plt.scatter(x_data,y_data)#plt.show()# 将数据按比例分成两组:训练和测试def split_dataset(x_dataset, y_dataset, ratio): arr = np.arange(x_dataset.size) np.random.shuffle(arr) num_train = int(ratio*x_dataset.size) x_train = x_dataset[arr[0:num_train]] y_train = y_dataset[arr[0:num_train]] x_test = x_dataset[arr[num_train:x_dataset.size]] y_test = y_dataset[arr[num_train:y_dataset.size]] return x_train,y_train,x_test,y_testx_train, y_train, x_test, y_test = split_dataset(x_data,y_data, ratio=0.7)print(type(x_train[0]))print(x_train)# 定义全局变量learning_rate = 0.000001training_epochs = 10000num_coeffs = 5# 定义多项式的系数w = tf.Variable( tf.truncated_normal([num_coeffs,1], mean=0.0,stddev= 1.0, dtype=tf.float64))# 添加偏置b = tf.Variable(tf.zeros(1,dtype=tf.float64))# 预定义模型def model(x, y): # 基于给定的权重预测y temp = [] for i in range(num_coeffs): temp.append(tf.add(w[i],tf.pow(x,i))) prediction = tf.add(tf.reduce_sum(temp),b) # 这是成本函数 errors =tf.square(y - prediction) return [prediction, errors]# 定义模型y, cost = model(x_train, y_train)# 定义训练方法optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)# 初始化所有变量init = tf.global_variables_initializer()#运行模型with tf.Session() as sess: sess.run(init) for epoch in list(range(training_epochs)): sess.run(optimizer) if epoch%1000 ==0: print('训练成本 = \n',sess.run(cost)) print('---------------------------------------------------------------------------------') print('---------------------------------------------------------------------------------') y_prediction, cost_prediction = model(x_test, y_test) print(sess.run(y_prediction))print(y_test[-1])