TensorFlow : 多项式回归

我正在尝试从这个链接提供的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])

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注