完整的构建一个神经网络流程

一. 数据清洗---删除或修复缺失值,处理异常值和噪声, 去除重复值,标准化和格式化

1.删除异常值--使用df.locdf.drop函数来删除数据集中的异常值

import pandas as pd
import numpy as np

# 生成包含异常值的DataFrame
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
df.iloc[3, 1] = np.nan
df.iloc[4, 1] = 500

# 删除'B'列中的异常值
df = df.loc[(df['B'] < 100) & (df['B'] > 0)]

print(df)
out:
   A   B
0  1  10
1  2  20
2  3  30

2. 填补缺失值 --- fillna函数来填补数据集中的缺失值

import pandas as pd
import numpy as np

# 生成包含缺失值的DataFrame
df = pd.DataFrame({'A': [1, 2, 3, np.nan, 5], 'B': [10, np.nan, 30, 40, 50]})

# 填补缺失值
df = df.fillna(method='ffill') # 使用前向填充法

print(df)

     A     B
0  1.0  10.0
1  2.0  10.0
2  3.0  30.0
3  3.0  40.0
4  5.0  50.0

3. 去除重复值--drop_duplicates函数来去除数据集中的重复值

import pandas as pd
import numpy as np

# 生成包含重复值的DataFrame
df = pd.DataFrame({'A': [1, 2, 3, 3, 5], 'B': [10, 20, 30, 30, 50]})

# 去除重复值
df = df.drop_duplicates()

print(df)

out:
   A   B
0  1  10
1  2  20
2  3  30
4  5  50

4.标准化和规范化--meanstd函数来计算数据集的均值和标准差,从而进行标准化和规范化

import pandas as pd
import numpy as np

# 生成需要标准化的DataFrame
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})

# 对'B'列进行标准化
df['B'] = (df['B'] - np.mean(df['B'])) / np

5.数据降维:将高维数据转换为低维数据,减少特征数量,提高计算效率,降低存储成本,防止过拟合,PCA----LDA

PCA(主成分分析):通过线性变换将原始数据投影到新的坐标系中,并选择一些最主要的方向(也称为主成分),使得新的坐标系中数据的方差最大。

第一步:标准化方法包括Z-score标准化和Min-Max标准化:使得不同特征之间的比较更加公平和准确,避免了特征值差异较大的特征对模型训练的影响。

Z-score标准化是将原始数据的每个特征值减去该特征的均值,然后除以该特征的标准差。该方法可以将特征值转换为具有均值为0,标准差为1的标准正态分布。

Min-Max标准化是将原始数据的每个特征值减去该特征的最小值,然后除以该特征的取值范围。该方法可以将特征值转换为0到1之间的数值。

 LDA(线性判别分析):与PCA相比,LDA具有更强的分类能力,因为它考虑了类别之间的距离关系。然而,LDA的一个局限性是需要先验地知道每个样本所属的类别信息,因此它不适用于无监督学习和聚类分析等任务。

二. 数据集成

1.)数据源的选择和获取:数据库,文件,API,Web爬虫,传感器或设备。

  1. 数据库查询工具:例如SQL Server Management Studio、MySQL Workbench等。
  2. 文件读取器:例如Python中的pandas库、R语言中的readr包等。
  3. API调用工具:例如Postman、curl等。
  4. 网络爬虫:例如Python中的Scrapy、BeautifulSoup等。
  5. 物联网设备SDK:例如Arduino SDK、Raspberry Pi SDK等。

2). 检查数据结构是否匹配: 

  1. 数据类型:需要检查不同数据源中的数据类型是否匹配。例如,一个数据源中的日期字段可能以“年-月-日”格式表示,而另一个数据源中的日期字段可能以“月/日/年”格式表示。这可能会导致数据类型不匹配,因此需要进行转换。
import pandas as pd

# 创建一个包含字符串的Series
s = pd.Series(['1', '2', '3'])

# 将字符串转换为整数
s_int = s.astype(int)
print(s_int)

# 将字符串转换为浮点数
s_float = s.astype(float)
print(s_float)
import pandas as pd

# 创建一个包含日期字符串的Series
s = pd.Series(['2022-01-01', '2022-01-02', '2022-01-03'])

# 将日期字符串转换为日期类型
s_date = pd.to_datetime(s)
print(s_date)
import pandas as pd

# 创建一个包含数值的Series
s = pd.Series([1, 2, 3])

# 将数值转换为字符串
s_str = s.astype(str)
print(s_str)

2.数据长度需要检查不同数据源中的数据长度是否匹配。

    1.删除缺失值:df = df.dropna()

import pandas as pd
import numpy as np

# 创建一个包含缺失值的DataFrame
df = pd.DataFrame({'A': [1, 2, 3, np.nan, 5], 'B': [10, 20, np.nan, 40, 50]})

# 在'A'列的第四个位置添加缺失值
df.iloc[3, 0] = np.nan

# 使用dropna函数删除缺失值
df = df.dropna()

print(df)

     A     B
0  1.0  10.0
1  2.0  20.0
4  5.0  50.0

   2.对齐数据长度: fill_value=None

import pandas as pd

# 创建一个包含两个Series的DataFrame
s1 = pd.Series([1, 2, 3, 4, 5])
s2 = pd.Series([10, 20, 30])
df = pd.DataFrame({'A': s1, 'B': s2})

# 对齐数据长度
df = df.reindex(columns=['A', 'B', 'C'], fill_value=None)

print(df)

   A   B   C
0  1  10 NaN
1  2  20 NaN
2  3  30 NaN
3  4 NaN NaN
4  5 NaN NaN

3).数据缺失值:

  1. 删除缺失值:当缺失值的比例很小或缺失值对数据分析的影响不大时,可以选择直接删除缺失值。删除缺失值可以减小样本量,但是也可能会带来样本偏差的问题。

  2. 插值填充缺失值:当缺失值的比例较大或缺失值对数据分析的影响比较大时,可以使用插值方法填充缺失值。插值方法包括线性插值、多项式插值、样条插值等,需要根据具体情况选择合适的方法。

  3. 使用模型估计缺失值:当缺失值的比例很大或缺失值对数据分析的影响非常大时,可以使用模型估计缺失值。常用的模型包括回归模型、聚类模型、决策树模型等,需要根据具体情况选择合适的模型。

三.设计一下网络结构

1. 确定输入和输出--通常将输入设置为原始数据,输出设置为所属的类别;对于回归问题,输入输出则分别对应于特征和目标值。

2. 确定层数和神经元数量:需要在保证模型拟合能力的前提下,尽量避免层数和神经元数量过多-过多则会过拟合

3. 选择激活函数:

1. Sigmoid函数--讲输入值映射到0-1之间,适用于二分类问题

此外,Sigmoid函数在输入值为0时,其导数为最大值0.25,可以加速神经网络的训练速度。

Sigmoid函数的输出在接近0或1时,梯度会变得非常小,称为梯度消失问题,这会导致网络的训练变得困难。其次,Sigmoid函数的输出不是以0为中心的,这会导致神经元的输出向某个方向偏移

2. ReLU函数 -- 输入值大于0时,输出等于输入值;在输入值小于等于0时,输出为0。

优点 : 计算简单--不会出现梯度消失--不存在输出偏移      

缺点 :不可导,反向传播算法无法进行更新(Dropout解决)

 3.tanh函数(双曲正切函数)-- tanh函数的取值范围为(-1,1),当输入值为0时,输出值也为0。在输入值较大时,tanh函数的输出接近于1,在输入值较小时,输出接近于-1。

 优点:具有零中心化, (-1,1)一直神经网络中的梯度爆炸

4.Softmax函数---用于多分类问题

  1. 将神经网络的输出转换为概率分布,能够方便地用于多分类问题中。

  2. 对每个神经元的输入值进行指数运算,能够增强网络对输入值的差异化敏感度,从而提高分类准确率。

  3. Softmax函数的输出值为非负数,并且和为1,具有归一化的特点。

四.设计损失函数

1.均方误差--回归问题--衡量模型预测值与真实值之间的差距 

import numpy as np

def mean_squared_error(y_true, y_pred):
    mse = np.mean((y_true - y_pred)**2)
    return mse

2.交插熵--多分类的问题--度量两个概率分布之间的距离

在多分类问题中,通常使用softmax作为神经网络输出层的激活函数,其将输入转换为概率分布向量 p,可以直接使用交叉熵作为损失函数。此外,交叉熵也可以用于二分类问题

import numpy as np

def cross_entropy(y_true, y_pred):
    epsilon = 1e-12
    # 将预测值中的0和1进行修正,避免取对数时出现错误
    y_pred = np.clip(y_pred, epsilon, 1. - epsilon)
    # 计算交叉熵损失
    ce = - np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
    return ce
np.clip用于将y_pred中小于等于0和大于等于1的值修正为接近0和1的极小值和极大值

3. 对数似然--评估模型预测结果的损失函数,与交叉熵类似,对数似然也可以用于分类问题中,特别是二分类问题。

import numpy as np

def log_likelihood(y_true, y_pred):
    """
    计算二分类问题的对数似然值

    参数:
    y_true: 真实标签,形状为 (n_samples,)
    y_pred: 预测概率,形状为 (n_samples,)

    返回:
    对数似然值,标量
    """
    # 将概率限制在一个极小的范围内,避免计算 log(0)
    y_pred = np.clip(y_pred, 1e-10, 1 - 1e-10)

    # 计算对数似然
    ll = np.sum(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

    return ll

五。定义优化器--更新神经网络模型参数的算法--最小化损失函数

  1. 随机梯度下降法(Stochastic Gradient Descent, SGD):每次从训练集中随机抽取一个样本来计算梯度,并用梯度更新参数。--可能会有噪声影响

    import numpy as np
    
    # 初始化参数
    theta = np.zeros(2)
    
    # 定义学习率
    learning_rate = 0.01
    
    # 定义迭代次数
    epochs = 100
    
    # 随机梯度下降法
    for i in range(epochs):
        # 随机选择一个样本
        idx = np.random.randint(X.shape[0])
        x = X[idx]
        y_true = y[idx]
    
        # 计算梯度
        y_pred = theta.dot(x)
        grad = (y_pred - y_true) * x
    
        # 更新参数
        theta = theta - learning_rate * grad
    

    2。动量梯度下降法(Momentum)--可以加速梯度下降的过程,并且可以跳过局部最小值,更容易收敛到全局最小值。

    import numpy as np
    
    # 初始化参数和动量变量
    theta = np.zeros(2)
    v = np.zeros(2)
    
    # 定义学习率和动量参数
    learning_rate = 0.01
    beta = 0.9
    
    # 定义迭代次数
    epochs = 100
    
    # 动量梯度下降法
    for i in range(epochs):
        # 随机选择一个样本
        idx = np.random.randint(X.shape[0])
        x = X[idx]
        y_true = y[idx]
    
        # 计算梯度
        y_pred = theta.dot(x)
        grad = (y_pred - y_true) * x
    
        # 更新动量变量和参数
        v = beta * v + (1 - beta) * grad
        theta = theta - learning_rate * v
    

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值