keras实现回归

Keras实现波士顿房价预测:回归问题详解与交叉验证
"""监督学习常见的两类问题:
1.分类:预测值是离散的
2.回归:预测值是连续的"""

"""下面利用keras解决回归问题"""
import tensorflow as tf
import tensorflow.keras as keras
import numpy as np

"""数据加载:
采用keras内置的波士顿房价数据集,只含有506个样本
训练样本404个,测试样本102个"""

from tensorflow.keras.datasets import boston_housing

(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()

print(train_data.shape,test_data.shape)
print(train_targets.shape,test_targets.shape)
# print(train_targets)

"""数据预处理:
各个特征维度的数据取值存在比较大的差异,为了减少网络的训练难度,
最好对特征维度数据做标准化,即使各个维度数据服从(0,1)的正态分布
注意的是:在实际过程中,测试集上数据标准化是依据训练集的,即不能从测试集分布上获取任何的先验知识"""
mean=train_data.mean(axis=0)
std=train_data.std(axis=0)

train_data=(train_data-mean)/std
test_data=(test_data-mean)/std
print(train_data.shape,test_data.shape)
print(train_targets.shape,test_targets.shape)

"""网络的构建:
由于数据量有限,所以尽量使用一个较小的网络结构"""
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import optimizers
from tensorflow.keras import losses

def build_model():
    model=models.Sequential()
    model.add(layers.Dense(64,activation="relu",input_shape=(train_data.shape[1],)))
    model.add(layers.Dense(64,activation="relu"))
    model.add(layers.Dense(1))
    """配置学习过程:
    回归问题,损失函数采用均方误差,MSE
    监控的指标采用平均绝对误差(mae),即预测值与目标值之差的绝对值"""
    model.compile(optimizer=optimizers.RMSprop(1e-3),loss=losses.MSE,metrics=['mae'])
    return model

"""验证集与训练集的划分:
由于整体数据集的规模都比较小,所以验证集就更小,这会导致在验证集上的评估有很大的波动
所以一般应采用k折交叉验证
k折交叉验证:
将数据划分为k个分区(k通常取4或5),实例化k个相同模型,将每个模型在
k-1个分区上训练,并在剩下一个分区上进行评估,
最后整个模型的验证分数等于k个验证分数的平均值"""

"""k折交叉验证的实现"""
k=4 #4z折交叉验证
num_val_samples=len(train_data)//k  #数据划分,每个分区上样本的数量
num_epoch=500
all_scores=[]  #存储验证集评估结果
print(f"开始进行{k}折交叉验证")
for i in range(k):
    print(f"current item:{i}")
    x_val=train_data[i*num_val_samples:(i+1)*num_val_samples]
    y_val=train_targets[i*num_val_samples:(i+1)*num_val_samples]

    x_train=np.concatenate([train_data[:i*num_val_samples],train_data[(i+1)*num_val_samples:]],axis=0)
    y_train=np.concatenate([train_targets[:i*num_val_samples],train_targets[(i+1)*num_val_samples:]],axis=0)

    model=build_model() #模型编译
    history=model.fit(x_train,y_train,batch_size=1,epochs=num_epoch,validation_data=(x_val,y_val),verbose=0)  #verbose:0为静默模式
    # val_mse,val_mae=model.evaluate(x_val,y_val)
    # print(history.history.keys())
    # input()
    mae_history=history.history['val_mae']
    all_scores.append(mae_history)

"""计算每个轮次中所有k折交叉验证的平均值"""
aver_epoch_mae=np.array(all_scores).mean(axis=0)

"""验证集评估曲线不够光滑,不易找出模型过拟合开始出现的点
所以需要对验证集做一定的处理
删除前10个数值比较大的点,将每个值替换成其与前面值的加权平均,可以使曲线变得更加平滑"""
def smooth_mae(points,factor=0.9):
    results=[]
    for point in points:
        if results:
            previous=results[-1]
            current=point*0.1+previous*0.9
            results.append(current)
        else:
            results.append(point)
    return results
smooth_mae_values=smooth_mae(aver_epoch_mae[10:])
print(smooth_mae_values)
"""绘制轮次的验证分数"""
import matplotlib.pyplot as plt

plt.figure(1)
plt.plot(list(range(1,num_epoch+1)),aver_epoch_mae)
plt.title("Every Epoch Val Aver MAE")
plt.xlabel("Epoch")
plt.ylabel("Val MAE")

plt.figure(2)
plt.plot(list(range(1,len(smooth_mae_values)+1)),smooth_mae_values)
plt.title("Every Epoch Val Aver Smooth MAE")
plt.xlabel("Epoch")
plt.ylabel("Val MAE")

plt.show()






<think>我们参考了多个引用来源,其中引用[1]和引用[2]展示了使用TensorFlow的Keras API实现线性回归的示例,引用[3]则展示了使用深度神经网络进行光谱数据回归的示例,其中数据来自Excel文件。用户的需求是查找使用Keras实现Excel数据回归的方法。 根据引用[1]和[2]的代码,我们可以总结出使用Keras进行回归任务的基本步骤: 1. 导入必要的库(包括pandas读取Excel文件,tensorflow构建模型,matplotlib绘图等) 2. 读取数据(使用pandas读取Excel文件) 3. 数据处理(可能需要将数据分为特征和标签,并进行归一化等预处理) 4. 构建神经网络模型(使用Sequential模型和Dense层) 5. 编译模型(选择合适的优化器和损失函数,回归问题常用均方误差损失'mse') 6. 训练模型(使用fit方法) 7. 评估和预测(使用训练好的模型进行预测,并评估效果) 引用[3]提供了一个更复杂的示例,使用了深度神经网络,并且数据来自Excel文件。该示例中还包括了数据预处理(如标准化或归一化)、划分训练集和测试集、使用正则化等步骤。 因此,我们可以为用户提供一个使用Keras对Excel数据进行回归分析的通用步骤和代码框架。由于用户没有提供具体的数据结构,我们假设Excel文件中有多个特征列和一个目标列。 步骤详解: 1. **导入必要的库** ```python import pandas as pd import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler ``` 2. **读取Excel数据** ```python # 假设Excel文件名为'data.xlsx',且数据在第一个工作表 data = pd.read_excel('data.xlsx') # 假设特征列名为X1, X2, ...,目标列名为y # 这里需要根据实际列名调整 X = data[['X1', 'X2', ...]].values y = data['y'].values ``` 3. **数据预处理** - 划分训练集和测试集 - 特征标准化(归一化) ```python # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 注意:使用训练集的均值和标准差 ``` 4. **构建模型** 根据问题复杂度选择网络结构。对于简单线性回归,可以只有一个没有激活函数的全连接层(如引用[1][2])。对于复杂问题,可以构建多层神经网络。 ```python model = Sequential() # 添加输入层和第一个隐藏层(示例为两个隐藏层) model.add(Dense(64, input_dim=X_train.shape[1], activation='relu')) # 输入维度为特征数 model.add(Dense(32, activation='relu')) model.add(Dense(1)) # 输出层,一个神经元,无激活函数(回归问题) ``` 5. **编译模型** ```python model.compile(optimizer='adam', loss='mse', metrics=['mae']) # mse: 均方误差,mae: 平均绝对误差 ``` 6. **训练模型** ```python history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_split=0.1) ``` 7. **评估模型** ```python loss, mae = model.evaluate(X_test, y_test) print(f'Test loss: {loss}, Test MAE: {mae}') ``` 8. **使用模型进行预测** ```python y_pred = model.predict(X_test) ``` 9. **可视化结果(可选)** - 绘制训练过程中的损失变化 - 绘制预测值与真实值的散点图 注意:以上代码是一个通用框架,实际应用时需要根据数据的具体情况调整参数(如网络层数、神经元个数、训练轮数、批量大小等)以及数据预处理步骤。 如果用户的数据集较小,可以简化网络结构以防止过拟合。另外,如果特征数量多且关系复杂,可能需要更深的网络。 引用文献: [^1]: 利用tensorflow2.0的keras演示回归(Python) [^2]: tf.keras实现线性回归 [^3]: 基于深度神经网络的光谱数据回归 相关问题: 1. 在使用Keras进行回归任务时,如何处理过拟合问题? 2. 如何选择神经网络的结构(层数、神经元数量)用于回归任务? 3. 除了均方误差,还有哪些常用的回归任务评估指标? </think>### 使用Keras实现Excel数据回归的方法 以下是基于TensorFlow/Keras实现Excel数据回归的完整步骤(参考引用[1][2][3]): #### 1. **数据准备** ```python import pandas as pd import numpy as np # 读取Excel数据(支持.xlsx/.xls) data = pd.read_excel('your_data.xlsx') # 替换为实际路径 # 提取特征和目标列(示例:使用前8列作为特征,第9列作为目标) X = data.iloc[:, :8].values.astype('float32') # 特征矩阵 y = data.iloc[:, 8].values.astype('float32') # 目标变量 ``` #### 2. **数据预处理** ```python from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 划分训练集/测试集(引用[3]方法) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征标准化(关键步骤) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) ``` #### 3. **构建Keras模型** ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 创建序列模型(引用[1][2]方法) model = Sequential([ Dense(64, activation='relu', input_shape=(X_train.shape[1],)), # 输入层 Dense(32, activation='relu'), # 隐藏层 Dense(1) # 输出层(回归无需激活函数) ]) # 打印模型结构 model.summary() ``` #### 4. **编译与训练** ```python # 编译模型(引用[1]优化方法) model.compile(optimizer='adam', loss='mse', # 均方误差适用于回归 metrics=['mae']) # 平均绝对误差 # 训练模型(引用[3]流程) history = model.fit( X_train, y_train, epochs=1000, batch_size=32, validation_split=0.2, # 从训练集划分验证集 verbose=1 # 显示进度条 ) ``` #### 5. **评估与预测** ```python # 评估测试集性能(引用[3]指标) test_loss, test_mae = model.evaluate(X_test, y_test) print(f"测试集MAE: {test_mae:.4f}") # 进行新数据预测 new_data = scaler.transform([[1.2, 3.4, 0.5, ...]]) # 需预处理 prediction = model.predict(new_data) print(f"预测结果: {prediction[0][0]}") ``` #### 6. **可视化结果** ```python import matplotlib.pyplot as plt # 绘制训练过程(引用[1]方法) plt.plot(history.history['mae'], label='训练MAE') plt.plot(history.history['val_mae'], label='验证MAE') plt.xlabel('Epochs') plt.ylabel('MAE') plt.legend() plt.show() ``` ### 关键注意事项 1. **数据预处理**:Excel数据需转换为数值矩阵,分类变量需编码(如One-Hot) 2. **特征工程**:通过`pd.read_excel()`后可使用Pandas进行特征处理 3. **超参数调优**: - 调整隐藏层数量/神经元数(复杂数据需更深网络) - 尝试不同优化器(`rmsprop`、`sgd`) - 添加正则化(`kernel_regularizer=regularizers.l2(0.01)`)防止过拟合[^3] 4. **部署建议**:使用`model.save('regression_model.h5')`保存模型 > 完整代码需根据实际Excel结构调整特征列和目标列索引,建议先用少量数据测试流程[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值