客户端码农学习ML —— 使用LinearRegressor实现线性回归

简介: 最近看了Google官方机器学习教程,跟着练习了部分示例,其中《使用 TensorFlow 的起始步骤》采用了LinearRegressor配合Pandas来进行线性回归训练。 于是使用两者重新写了一个版本的线性回归训练,数据也从之前python直接生成模拟数据改成了从csv文件读取,而csv文件来源于Excel: A列的100行等于1至100的序列, B=A*5+50+RANDBETWEEN(-10, 10)。

最近看了Google官方机器学习教程,跟着练习了部分示例,其中《使用 TensorFlow 的起始步骤》采用了LinearRegressor配合Pandas来进行线性回归训练。

于是使用两者重新写了一个版本的线性回归训练,数据也从之前python直接生成模拟数据改成了从csv文件读取,而csv文件来源于Excel: A列的100行等于1至100的序列, B=A*5+50+RANDBETWEEN(-10, 10)。

读取数据集及特征准备

import numpy as np
import pandas as pd
from sklearn import metrics
import tensorflow as tf
from tensorflow.python.data import Dataset
import math

linear_dataframe = pd.read_csv("../data/linear_data.csv", sep=",")

print('linear_dataframe.describe()=%s\n' % linear_dataframe.describe())

x_series = linear_dataframe["x"].apply(lambda x: max(x, -10000))
my_feature_dataframe = linear_dataframe[["x"]]

x_feature_column = tf.feature_column.numeric_column("x")
feature_columns = [x_feature_column]

target_series = linear_dataframe["y"]

训练

my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.0001)
# my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)

linear_regressor = tf.estimator.LinearRegressor(feature_columns=feature_columns, optimizer=my_optimizer)


def my_input_fn(feature_dataframe, target_series, batch_size=1, shuffle=True, num_epochs=None):
    features = {key: np.array(value) for key, value in dict(feature_dataframe).items()}

    ds = Dataset.from_tensor_slices((features, target_series))
    ds = ds.batch(batch_size).repeat(num_epochs)

    if shuffle:
        ds = ds.shuffle(buffer_size=10000)

    features, labels = ds.make_one_shot_iterator().get_next()
    return features, labels


_ = linear_regressor.train(input_fn=lambda: my_input_fn(my_feature_dataframe, target_series), steps=2000)

结果评估

predict_input_fn = lambda: my_input_fn(my_feature_dataframe, target_series, num_epochs=1, shuffle=False)

predictions = linear_regressor.predict(input_fn=predict_input_fn)
predictions = np.array([item['predictions'][0] for item in predictions])

mean_squared_error = metrics.mean_squared_error(predictions, target_series)
root_mean_squared_error = math.sqrt(mean_squared_error)
print("Mean Squared Error (on training data): %0.3f" % mean_squared_error)
print("Root Mean Squared Error (on training data): %0.3f" % root_mean_squared_error)

min_y_value = target_series.min()
max_y_value = target_series.max()
min_max_difference = max_y_value - min_y_value

print("Min. x Value: %0.3f" % min_y_value)
print("Max. x: %0.3f" % max_y_value)
print("Difference between Min. and Max.: %0.3f" % min_max_difference)
print("Root Mean Squared Error: %0.3f" % root_mean_squared_error)

weight = linear_regressor.get_variable_value('linear/linear_model/x/weights')
bias = linear_regressor.get_variable_value('linear/linear_model/bias_weights')
print('\n weight=%s  bias=%s' % (weight, bias))
[[_w]] = weight
[_b] = bias

result_dataframe = pd.DataFrame()
result_dataframe["predictions"] = pd.Series(predictions)
result_dataframe["targets"] = target_series
print('\nresult dataframe:\n%s' % result_dataframe.describe())

结果可视化

def show_visualization_data(x_data_array, y_data_array, w, b, loss_vec, title=None):
    best_fit = []
    for x in x_data_array:
        best_fit.append(w * x + b)

    plt.figure()

    if title is not None:
        plt.title(title)

    ax = plt.subplot(121)
    ax.scatter(x_data_array, y_data_array, color='y', label="样本", linewidths=0.5)
    ax.plot(x_data_array, best_fit, color='b', linewidth=2)

    if loss_vec is not None:
        ax = plt.subplot(122)
        ax.plot(loss_vec, color='g', linewidth=1)
        ax.set_ylim(0, 1000)

    plt.show()

show_visualization_data(x_series, target_series, _w, _b, None, title='Pandas')

可以得到与上一篇《客户端码农学习ML —— 用TensorFlow实现线性回归算法》文中相似的图片:

ai_kai_line_only_mul_batch_line

参考

http://qianhk.com/2018/05/客户端码农学习ML-使用LinearRegressor实现线性回归/

https://developers.google.cn/machine-learning/crash-course/prereqs-and-prework

https://colab.research.google.com/notebooks/mlcc/first_steps_with_tensor_flow.ipynb?hl=zh-cn

本文首发于钱凯凯的博客

 

目录
相关文章
|
机器学习/深度学习 数据采集 自然语言处理
【机器学习实战】10分钟学会Python怎么用LASSO回归进行正则化(十二)
【机器学习实战】10分钟学会Python怎么用LASSO回归进行正则化(十二)
2517 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
从菜鸟到大师:Scikit-learn库实战教程,模型训练、评估、选择一网打尽!
【9月更文挑战第13天】在数据科学与机器学习领域,Scikit-learn是不可或缺的工具。本文通过问答形式,指导初学者从零开始使用Scikit-learn进行模型训练、评估与选择。首先介绍了如何安装库、预处理数据并训练模型;接着展示了如何利用多种评估指标确保模型性能;最后通过GridSearchCV演示了系统化的参数调优方法。通过这些实战技巧,帮助读者逐步成长为熟练的数据科学家。
126 3
|
7月前
|
机器学习/深度学习 算法 PyTorch
从零开始学习线性回归:理论、实践与PyTorch实现
从零开始学习线性回归:理论、实践与PyTorch实现
从零开始学习线性回归:理论、实践与PyTorch实现
|
7月前
|
机器学习/深度学习 API 开发者
深入浅出:使用Python实现机器学习模型的部署
在本文中,我们将探讨如何使用Python语言将机器学习模型从开发环境迁移到生产环境的过程。与传统的技术文章摘要不同,我们不仅会概述关键步骤和常见挑战,还将引入一个简易的案例研究,通过这个案例,读者能够更直观地理解模型部署的全过程及其重要性。我们将重点讨论模型封装、API设计、容器化技术以及云服务部署等关键技术,旨在为广大开发者提供一个清晰、实用的模型部署指南。
|
7月前
|
机器学习/深度学习 算法 大数据
【Python机器学习】决策树与随机森林的讲解及决策树在决策决策问题中实战(图文解释 附源码)
【Python机器学习】决策树与随机森林的讲解及决策树在决策决策问题中实战(图文解释 附源码)
79 0
|
机器学习/深度学习 传感器 自然语言处理
【机器学习实战】10分钟学会Python怎么用GBM梯度提升机进行预测(十四)
【机器学习实战】10分钟学会Python怎么用GBM梯度提升机进行预测(十四)
674 0
|
机器学习/深度学习 算法 数据可视化
入坑机器学习:四,单变量线性回归
各类回归模型,例如线性回归、广义线性模型(Generalized Linear Model, GLM)和人工神经网络(Artificial Neural Network, ANN)通过最小化L2或L1损失对其参数进行估计。L2损失和L1损失的不同在于,L2损失通过平方计算放大了估计值和真实值的距离,因此对偏离观测值的输出给予很大的惩罚。此外,L2损失是平滑函数,在求解其优化问题时有利于误差梯度的计算;L1损失对估计值和真实值之差取绝对值,对偏离真实值的输出不敏感,因此在观测中存在异常值时有利于保持模型稳定。
134 0
入坑机器学习:四,单变量线性回归
|
机器学习/深度学习 监控 算法
机器学习测试笔记(11)——线性回归方法(上)
机器学习测试笔记(11)——线性回归方法(上)
314 0
机器学习测试笔记(11)——线性回归方法(上)
|
机器学习/深度学习 监控 算法
机器学习测试笔记(12)——线性回归方法(下)
机器学习测试笔记(12)——线性回归方法(下)
121 0
机器学习测试笔记(12)——线性回归方法(下)
|
机器学习/深度学习 存储 监控
机器学习测试笔记(17)——线性回归函数(下)
机器学习测试笔记(17)——线性回归函数(下)
137 0