基于ChatGPT4学习大模型day1

前言

假设我现在有个简单的需求:
我有一批历史数据数据,每条数据有6个指标字段,这些数据作为训练数据输入,训练完成后,我可以根据一条数据的3个字段,生成另外3个字段的模拟数据

前前后后通过和gpt4的多次问答,最后完成这个简单的demo,demo使用的模型是随机森林(Random Forest)。

它回答的几近完美,但是很多在知识匮乏的情况下,它回答的很多内容其实对初学者来说太过深奥了(随便一个问题问到底都可能扯出一堆知识点),所以本文就只以初学者(有一定编程基础)的角度,简化了部分它回答的内容,无关的,跑题的,不需要了解太多的,我全部过滤掉了。

步骤

步骤 1: 数据准备和预处理

  1. 读取数据集并进行必要的预处理,如缺失值处理、数据类型转换等。
  2. 确保数据中的 ID 是唯一的,因为你会根据 ID 来检索和生成数据。
  3. 将数据集分为两部分:一部分包含用于条件输入的字段,另一部分包含要生成的字段。

步骤 2: 特征选择和数据分割

  1. 根据业务逻辑和数据分析结果,选择相关的特征。
  2. 从数据中分割出训练集和验证集。

步骤 3: 模型构建和训练

  1. 选择合适的机器学习模型。对于条件生成任务,可以考虑使用如条件变分自编码器(CVAE)或条件生成对抗网络(CGAN)。
  2. 构建模型,将 ID 和已知的 4 个字段作为条件输入,其余字段作为模型需要生成的目标。
  3. 训练模型,调整超参数以获得最佳性能。

步骤 4: 模型评估和优化

  1. 在验证集上测试模型,评估生成数据的准确性和真实性。
  2. 根据评估结果调整模型结构和参数。

步骤 5: 数据生成

  1. 根据用户提供的 ID 和 4 个字段的数据,使用训练好的模型生成剩余字段的数据。
  2. 需要确保生成的数据满足任何已知的业务规则或约束。

准备

1、首先,确保你已经安装了scikit-learnpandas库。如果没有安装,可以使用以下命令来安装:

pip install scikit-learn pandas

2、准备训练的数据,我自己准备了100多万数据

代码

import pandas as pd
from joblib import dump, load
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split, GridSearchCV


# 主函数
# 输入三个指标:watch_count,like_count,gift_user_count
# 输出三个指标:watch_user_count,comment_count,comment_user_count
def main():
    model = get_model(True)
    # 使用模型生成数据
    input_data = pd.DataFrame({
        # 输入三个指标
        'watch_count': [2152],
        'like_count': [18230],
        'gift_user_count': [14],
    })
    simulated_data = simulate_data(model, input_data)
    print("Simulated Data:", simulated_data)


# 创建数据集
def create_dataset():
    # 自备数据,这里是通过spark输出的部分数据作为训练数据
    df = pd.read_csv(
        '/Users/fangyirui/Documents/input/p1p2Data.csv/part-00000-adc31a3e-8ae2-4394-b10d-3e6055674306-c000.csv')
    return df


# 根据训练好的模型进行数据模拟
def simulate_data(model, input_data):
    predicted = model.predict(input_data)
    return predicted


# 获取训练模型,传入参数标识是否需要重新训练模型,ture为是,false为导入训练好的模型
def get_model(reset):
    if reset:
        # 创建数据集
        df = create_dataset()

        # 选择条件特征和目标特征
        # 输入的指标
        condition_features = ['watch_count', 'like_count', 'gift_user_count']
        # 输出的指标
        target_features = ['watch_user_count', 'comment_count', 'comment_user_count']

        # 分割数据集
        X = df[condition_features]
        y = df[target_features]
        x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

        # 优化模型参数,执行一次即可,我执行了两次,输出了两次最优的参数,直接填到下面的模型训练方法中
        # {'max_depth': 10, 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 100}
        # {'max_depth': 10, 'min_samples_leaf': 1, 'min_samples_split': 3, 'n_estimators': 100}
        # model_optimize(x_train, y_train)

        # 创建模型
        # 参数解释:verbose 0无日志输出,1输出tasks每个并行度的完成时间,2在1的基础上增加task的进度,3及以上跟2没有区别了
        model = RandomForestRegressor(n_estimators=100, random_state=42, verbose=2, min_samples_leaf=1,
                                      min_samples_split=2,
                                      max_depth=10)

        # 应用数据训练模型
        model.fit(x_train, y_train)
        # 保存模型到文件
        dump(model, '/Users/fangyirui/Documents/input/trained_model_new.joblib')
        # 在测试集上评估模型
        y_pred = model.predict(x_test)
        mse = mean_squared_error(y_test, y_pred)
        print(f"Mean Squared Error: {mse}")
        return model
    else:
        model = load('/Users/fangyirui/Documents/input/trained_model_new.joblib')
        return model


# 模型超参数优化
def model_optimize(x_train, y_train):
    # 指定你要只用的模型
    model = RandomForestRegressor(random_state=42)

    # 设置想要优化组合,比如n_estimators你设置了100和200,最后输出的结果为100,说明100比200要优,就可以再试试100和150这样
    param_grid = {
        'n_estimators': [100, 150],
        'max_depth': [10, 15],
        'min_samples_split': [2, 3],
        'min_samples_leaf': [1, 2]
    }

    # 创建 GridSearchCV 对象
    grid_search = GridSearchCV(estimator=model,
                               param_grid=param_grid,
                               cv=5,
                               scoring='neg_mean_squared_error',
                               verbose=2)

    # 执行网格搜索
    grid_search.fit(x_train, y_train)

    # 查看结果
    print(grid_search.best_params_)


if __name__ == "__main__":
    main()

答疑

1、train_test_split(X, y, test_size=0.2, random_state=42) 这行代码是什么意思

train_test_split 是 scikit-learn 库中的一个函数,用于将数据集划分为训练集和测试集。这在机器学习中是一个常见的步骤,因为你需要在一组数据上训练模型,并在另一组未见过的数据上评估模型的性能。

这行代码的意思是:

  • X:包含特征数据的变量。在大多数情况下,这是一个二维数组或 DataFrame,其中每一行是一个样本,每一列是一个特征。
  • y:包含目标数据的变量。这通常是一个一维数组或 Series,长度与 X 的行数相同。
  • test_size=0.2:表示测试集应该包含原始数据集的 20%。相应地,剩下的 80% 将用作训练集。
  • random_state=42:是一个随机数种子,用于确保每次划分都是相同的。这样做的目的是为了可重复性,即每次运行代码时都会得到相同的训练集和测试集。

函数的返回值是四个部分:X_train, X_test, y_train, y_test

  • X_train:用于训练模型的特征数据集部分。
  • X_test:用于测试模型的特征数据集部分。
  • y_train:与 X_train 对应的目标数据,用于训练模型。
  • y_test:与 X_test 对应的目标数据,用于评估模型。

这行代码将整个数据集分成两组,一组用于建立(训练)模型,另一组用于测试模型的性能(测试)。这是确保模型泛化能力的标准做法。

2、控制台打印的:Mean Squared Error: 8723122.741238702 是什么意思

“Mean Squared Error: 8723122.741238702” 表示模型在测试集上的表现的均方误差(Mean Squared Error,简称 MSE)是 8723122.741238702。均方误差是回归任务中常用的性能评估指标之一,它计算了模型预测值与实际值之间差异的平方的平均值。

具体来说,MSE 的计算公式如下:

[ \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 ]

其中:

  • ( n ) 是测试集中样本的数量。
  • ( y_i ) 是第 ( i ) 个样本的实际值。
  • ( \hat{y}_i ) 是第 ( i ) 个样本的模型预测值。

MSE 的值越小,表示模型的预测值与实际值越接近,模型的性能越好。一个较大的 MSE 值(如例子中的 8723122.741238702)通常表示模型预测的误差较大,可能需要进一步调整模型参数、改进模型结构,或者重新审视数据的预处理和特征工程步骤。

在实际应用中,MSE 的绝对值可能难以直观理解,因为它依赖于数据的规模和范围。因此,除了查看 MSE 的值,也常常会查看均方根误差(Root Mean Squared Error, RMSE)或者与目标变量范围相关的标准化指标,如 R-squared(决定系数)来评估模型性能。

3、随机森林的模型,超参数怎么调整

调整随机森林模型的超参数是一个重要的过程,可以显著影响模型的性能。以下是随机森林中一些关键超参数以及它们如何影响模型表现:

  1. n_estimators:决策树的数量。增加树的数量通常会提高模型性能,直到达到一定限度后性能稳定。但同时也会增加计算成本和时间。
  2. max_depth:每棵树的最大深度。较深的树可以学习更复杂的模式,但也可能导致过拟合。
  3. min_samples_split:分割内部节点所需的最小样本数。这个值越大,生成树就越保守。
  4. min_samples_leaf:叶子节点所需的最小样本数。这个值同样控制着树结构和复杂度。
  5. max_features:寻找最佳分割时要考虑的特征数量上限。增加这个参数通常可以提高模型性能,因为在每次分割时考虑更多特征意味着有更多机会找到一个好分割点。
  6. bootstrap:是否采用有放回抽样来创建训练集,默认为 True。
  7. oob_score(Out-of-Bag Score):是否使用未被抽取作为训练集中某颗决策树训练数据点来评估该决策树,默认为 False。
  8. criterion: 衡量质量分裂标准,默认 “gini” 对于分类问题, “mse” 对于回归问题.
  9. max_leaf_nodes: 最大叶子节点数目, 通过限制叶子节点数目来防止过拟合.
  10. class_weight: 类别权重, 主要用于处理不平衡类别问题.

调整超参数通常需要使用交叉验证,并且基于评估指标(如均方误差、精确度、F1 分数等)进行迭代试验以找到最佳组合。下面介绍两种常见方法:

网格搜索 (Grid Search)

网格搜索是一种通过遍历给定参数网格中所有可能组合来寻找最优超参数设置方法。

pythonfrom sklearn.model_selection import GridSearchCV

# 设置想要优化组合
param_grid = {
    'n_estimators': [100, 200],
    'max_depth': [None, 10, 20],
    'min_samples_split': [2, 5],
    'min_samples_leaf': [1, 2]
}

# 创建随机森林对象
rf = RandomForestRegressor(random_state=42)

# 创建 GridSearchCV 对象
grid_search = GridSearchCV(estimator=rf,
                           param_grid=param_grid,
                           cv=5,
                           scoring='neg_mean_squared_error',
                           verbose=2)

# 执行网格搜索
grid_search.fit(X_train, y_train)

# 查看结果
print(grid_search.best_params_)

随机搜索 (Randomized Search)

与网格搜索遍历所有可能组合不同,随机搜索从指定范围内随机选取超参数组合进行尝试。

pythonfrom sklearn.model_selection import RandomizedSearchCV

# 设置想要优化范围
param_distributions = {
    'n_estimators': range(100, 500),
    'max_depth': [None] + list(range(5, 25)),
    # 其他可调整参数...
}

# 创建 RandomizedSearchCV 对象 
random_search = RandomizedSearchCV(estimator=rf,
                                   param_distributions=param_distributions,
                                   n_iter=10,
                                   cv=5,
                                   scoring='neg_mean_squared_error',
                                   verbose=2)

random_search.fit(X_train, y_train)
print(random_search.best_params_)

请注意,在实际应用中你需要选择适当范围和步长,并且可能需要运行多次以获得较好结果。此外,在执行这些操作之前,请确保你已经对数据进行了充分预处理,并选择了正确评估指标反映你希望解决问题类型(例如分类或回归)。

4、# 创建随机森林对象 rf = RandomForestRegressor(random_state=42) 你给的例子中,这个rf是不是要替换成我之前训练好的模型

不一定。在这个上下文中,rf = RandomForestRegressor(random_state=42) 创建了一个新的随机森林回归器实例,用于网格搜索过程中寻找最佳超参数组合。这里的 rf 是未经训练的模型。

如果你已经有一个训练好的模型,并且只是想要调整它的超参数来看是否可以进一步提高性能,那么你可以使用该模型作为起点进行网格搜索。但通常情况下,在进行网格搜索时,我们从未训练过的模型开始,因为我们希望每个超参数组合都在同等条件下被评估。

在使用 GridSearchCVRandomizedSearchCV 进行超参数优化时,默认情况下会对每种超参数组合创建新的模型实例,并用交叉验证数据集进行独立训练和评估。所以即使你之前有一个已经训练好了的随机森林模型,在执行网格搜索时也不会直接使用它。

总结来说:

  • 如果你是第一次寻找最佳超参数并且没有预先训练好的模型,则应该像示例代码中那样创建一个新实例。
  • 如果你已经有了一个通过某些初始设定(包括可能是默认设置)得到并且已经部分调优过或者完全没有调优过但已经被初步训练过(例如用于基准测试)的随机森林回归器,并且想要进一步探索其他可能更好地超参数配置,则可以将其传递给 GridSearchCVRandomizedSearchCV 作为基础来开始搜索。但请记住,在这种情况下,传递给这些函数类对象将仅仅利用其初始设置而非其学习到任何数据后得到状态(因为交叉验证需要从头开始重新学习)。
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿-瑞瑞

打赏不准超过你的一半工资哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值