首页 > 编程语言 >基于TensorFlow和Python的机器学习(笔记2)

基于TensorFlow和Python的机器学习(笔记2)

时间:2022-10-21 15:23:59浏览次数:43  
标签:MPG set keras Python 笔记 dataset 图表 train TensorFlow

基于TensorFlow和Python的机器学习(笔记2)

 

 

 

 

 

油耗预测项目(实战)

import io

import os.path

import matplotlib.pyplot as plt

import keras.utils

import tensorflow as tf

import pandas as pd

#下载汽车油耗数据集--加州大学欧文分校

dataset_path = 'C:\\Users\\Administrator\\.keras\\datasets\\auto-mpg.data'

if not os.path.exists(dataset_path):

    dataset_path = keras.utils.get_file('auto-mpg.data',

                                        'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data')

# 'C:\\Users\\Administrator\\.keras\\datasets\\auto-mpg.data'

 

# 利用 pandas 读取数据集,字段有效能(公里数每加仑),气缸数,排量,马力,重量,加速度,型号年份,产地

column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight',

                'Acceleration', 'Model Year', 'Origin']

#读取数据

raw_dataset = pd.read_csv(dataset_path, names=column_names, na_values='?', comment='\t', sep=' ', skipinitialspace=True)

#复制数据

dataset = raw_dataset.copy()

#查看数据

print(dataset.head())

print('空白数据个数=', dataset.isna().sum())

#去除空白数据

dataset = dataset.dropna()

#查看数据

print('空白数据个数=', dataset.isna().sum())

#产地数据转换为3列,相当于onehot表示形式

# 对于产地地段, 1 表示美国, 2 表示欧洲, 3 表示日本。

origin = dataset.pop('Origin')

dataset['USA'] = (origin == 1) * 1.0

dataset['Europe'] = (origin == 2) * 1.0

dataset['Japan'] = (origin == 3) * 1.0

print('tail=\n', dataset.tail())

#划分数据集,其中80%用于训练 20%用于测试

train_dataset = dataset.sample(frac=0.8, random_state=0)

test_dataset = dataset.drop(train_dataset.index)

#弹出MPG列数据

train_label = train_dataset.pop('MPG')

test_label = test_dataset.pop('MPG')

#训练数据状态信息

train_stat = train_dataset.describe()

# train_stat.pop('MPG')

print('train_stat=\n', train_stat)

#转置矩阵

train_stat = train_stat.transpose()

 

#定义数据标准化函数

def norm(x):

    return (x - train_stat['mean']) / train_stat['std']

 

#训练数据标准化

normed_train_data = norm(train_dataset)

#测试数据标准化

normed_test_data = norm(test_dataset)

 

print(normed_train_data.shape, train_label.shape)

print(normed_test_data.shape, test_label.shape)

 

train_db = tf.data.Dataset.from_tensor_slices((normed_train_data.values, train_label.values))

train_db = train_db.shuffle(100).batch(32)

 

import matplotlib

 

print(matplotlib.matplotlib_fname())

 

# # 解决plt中文乱码问题-方法1

# # plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体

# # plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

#

#

# #创建一个有4个子图表的图表,2行2列

# # 接收数据格式要写成2*2的矩阵形式

# #2 2表示图表行数和列数

# #figsize表示图表尺寸

# #fig用于接收整个图表

# #ax1用于接收第1行第1列的子图表

# #ax2用于接收第1行第2列的子图表

# #ax3用于接收第2行第1列的子图表

# #ax4用于接收第2行第2列的子图表

# fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2, figsize=(8, 8))

# #设置图标的居中标题,字号fontsize为20,颜色c为红色

# fig.suptitle('油耗关系曲线',fontsize=20,c='red')

# #绘制第1个子图表

# #scatter表示绘制散点图

# #X数据为dataset中的名称为Cylinders的列数据

# #Y数据为dataset中名称为MPG的列数据

# #c表示散点的颜色为red

# #edgecolors表示散点的边缘颜色

# #s表示散点的大小size

# #linewidth表示边缘的线宽

# ax1.scatter(dataset['Cylinders'], dataset['MPG'], c='red', edgecolors='blue', s=100, linewidth=2)

# #设置子图表1的标题

# ax1.set_title('MPG和气缸数 散点图')

# #设置子图表1的x轴标签/名称

# ax1.set_xlabel('气缸数')

# #设置子图表1的y轴标签/名称

# ax1.set_ylabel('MPG')

# #绘制第2个子图表

# ax2.scatter(dataset['Displacement'], dataset['MPG'], c='y', edgecolors='k', s=50, linewidth=2)

# ax2.set_title('MPG和排量 散点图')

# ax2.set_xlabel('排量')

# ax2.set_ylabel('MPG')

# #绘制第3个子图表

# ax3.scatter(dataset['Horsepower'], dataset['MPG'], c='g', edgecolors='b', s=40, linewidth=2)

# ax3.set_title('MPG和马力 散点图')

# ax3.set_xlabel('马力')

# ax3.set_ylabel('MPG')

# #绘制第4个子图表

# ax4.scatter(dataset['Weight'], dataset['MPG'], c='r', edgecolors='k', s=30, linewidth=2)

# ax4.set_title('MPG和重量 散点图')

# ax4.set_xlabel('重量')

# ax4.set_ylabel('MPG')

# #显示图表

# plt.show()

 

 

 

from keras import layers

from keras import losses

 

# 创建模型,3层的全连接网络

class Network(keras.Model):

    def __init__(self):

        super(Network, self).__init__()

        # 创建3个全连接层

        self.fc1 = keras.layers.Dense(64, activation='relu')

        self.fc2 = keras.layers.Dense(64, activation='relu')

        self.fc3 = keras.layers.Dense(1)

    def call(self, inputs, training=None, mask=None):

        # 依次通过 3 个全连接层

        x=self.fc1(inputs)

        x=self.fc2(x)

        x=self.fc3(x)

 

        return x

#创建网络实例

model=Network()

model.build(input_shape=(4,9))

#查看网络概述信息

model.summary()

#创建优化器,指定超参数 学习率learning rate=0.001

optimizer=tf.keras.optimizers.RMSprop(0.0001)

 

for epoch in range(2000):

    for step,(x,y) in enumerate(train_db):

        with tf.GradientTape() as tape:

            out=model(x)# 通过网络获得输出

            #计算损失函数

            loss=tf.reduce_mean(losses.MSE(y,out))

            mae_loss=tf.reduce_mean(losses.MAE(y,out))

        if step%10==0:

            print(epoch,step,loss)

 

        # 计算梯度,并更新

        grad=tape.gradient(loss,model.trainable_variables)

        optimizer.apply_gradients(zip(grad,model.trainable_variables))

 

 

标签:MPG,set,keras,Python,笔记,dataset,图表,train,TensorFlow
From: https://www.cnblogs.com/zhangdezhang/p/16813583.html

相关文章