分子AI预测赛Task1笔记

发布于:2024-07-03 ⋅ 阅读:(14) ⋅ 点赞:(0)

实践步骤:跑通baseline → 尝试个人idea→尝试进阶baseline

一、跑通baseline

  • 根据官方操作文档:https://datawhaler.feishu.cn/wiki/Ue7swBbiJiBhsdk5SupcqfL7nLX#VAwHduw0woxtZIxuCRnchAZ5nef
  • 运行结果如下
    # python环境官方自带
    
    # 下载需求库
    # pip install lightgbm openpyxl
    
    
    
    # 运行测试代码
    # 1. 导入需要用到的相关库
    # 导入 pandas 库,用于数据处理和分析
    import pandas as pd
    # 导入 numpy 库,用于科学计算和多维数组操作
    import numpy as np
    # 从 lightgbm 模块中导入 LGBMClassifier 类
    from lightgbm import LGBMClassifier
    
    
    
    # 2. 读取训练集和测试集
    # 使用 read_excel() 函数从文件中读取训练集数据,文件名为 'traindata-new.xlsx'
    train = pd.read_excel('./data/data280993/traindata-new.xlsx')
    # 使用 read_excel() 函数从文件中读取测试集数据,文件名为 'testdata-new.xlsx'
    test = pd.read_excel('./data/data280993/testdata-new.xlsx')
    
    # 3 特征工程
    # 3.1 test数据不包含 DC50 (nM) 和 Dmax (%),将train数据中的DC50 (nM) 和 Dmax (%)删除
    train = train.drop(['DC50 (nM)', 'Dmax (%)'], axis=1)
    
    # 3.2 将object类型的数据进行目标编码处理
    for col in train.columns[2:]:
        if train[col].dtype == object or test[col].dtype == object:
            train[col] = train[col].isnull()
            test[col] = test[col].isnull()
    
    # 4. 加载决策树模型进行训练
    model = LGBMClassifier(verbosity=-1)
    model.fit(train.iloc[:, 2:].values, train['Label'])
    pred = model.predict(test.iloc[:, 1:].values, )
    
    # 5. 保存结果文件到本地
    pd.DataFrame(
        {
            'uuid': test['uuid'],
            'Label': pred
        }
    ).to_csv('submit.csv', index=None)
  • 以上代码运行结果提交的得分如下 

 二、个人感悟

  • 先声明,本人有一点python基础,但是对机器学习一概不知,纯小白,所以上面的代码除了pandas部分略懂,后面不知道具体在做什么
  • 简单看了一下LightGBM的数学原理解读,说实话看不懂,跟看天书一样
  • 然后经过这个baseline的测试,根据官方给的baseline注解,大致是对该数据集进行预测训练处理,后续要我们做的就是不断的去找到最优的模型进行训练,找到最优的算法去训练从而提高得分

 三、构思idea,改进baseline

  • 用于训练的模型应该有许多种,借助AI工具,直接生成代码(机器学习纯小白,不建议大家想我这样)
  • 例如随机森林模型:
    # 1. 导入需要用到的相关库
    import pandas as pd
    import numpy as np
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import LabelEncoder
    
    # 2. 读取训练集和测试集
    train = pd.read_excel('./data/data280993/traindata-new.xlsx')
    test = pd.read_excel('./data/data280993/testdata-new.xlsx')
    
    # 3. 特征工程
    # 3.1 删除train数据中的 'DC50 (nM)' 和 'Dmax (%)' 列
    train = train.drop(['DC50 (nM)', 'Dmax (%)'], axis=1)
    
    # 3.2 处理分类数据
    # 使用LabelEncoder对分类特征进行编码
    label_encoders = {}
    for col in train.columns[2:]:  # 跳过前两列('No' 和 'uuid')
        if train[col].dtype == object:
            # 合并训练集和测试集的类别
            combined_data = pd.concat([train[col], test[col]])
            le = LabelEncoder()
            combined_data = le.fit_transform(combined_data)
            train[col] = combined_data[:len(train)]
            test[col] = combined_data[len(train):]
            label_encoders[col] = le  # 保存编码器以备后用
    
    # 检查测试集中非数值类型的特征
    non_numeric_cols = test.select_dtypes(include=['object']).columns.tolist()
    
    # 处理非数值类型的特征
    for col in non_numeric_cols:
        # 如果该特征应该在模型中,确保它是数值类型的
        if col in train.columns[2:]:
            # 尝试将字符串转换为数值类型
            test[col] = pd.to_numeric(test[col], errors='coerce')
    
    # 确保测试集中没有缺失值
    test = test.fillna(0)
    
    # 重新训练模型并预测
    rf_model.fit(X_train, y_train)
    pred = rf_model.predict(test.iloc[:, 1:].values)
    result = pd.DataFrame({'uuid': test['uuid'], 'Label': pred})
    
    # 4. 加载随机森林模型进行训练
    X_train = train.iloc[:, 2:].values
    y_train = train['Label'].values
    X_test = test.iloc[:, 1:].values
    
    rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
    rf_model.fit(X_train, y_train)
    
    # 5. 使用模型进行预测并保存结果
    pred = rf_model.predict(X_test)
    result = pd.DataFrame({'uuid': test['uuid'], 'Label': pred})
    
    # 保存结果文件到本地
    result.to_csv('submit_rf.csv', index=False) 
    # 0.73905
    
  • 或者是随机森林模型优化版:
  • # 1. 导入需要用到的相关库
    import pandas as pd
    import numpy as np
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn.preprocessing import LabelEncoder
    from sklearn.feature_selection import SelectFromModel
    
    # 2. 读取训练集和测试集
    train = pd.read_excel('./data/data280993/traindata-new.xlsx')
    test = pd.read_excel('./data/data280993/testdata-new.xlsx')
    
    # 3. 特征工程
    # 3.1 删除train数据中的 'DC50 (nM)' 和 'Dmax (%)' 列
    train = train.drop(['DC50 (nM)', 'Dmax (%)'], axis=1)
    
    # 3.2 处理分类数据
    # 使用LabelEncoder对分类特征进行编码
    label_encoders = {}
    for col in train.columns[2:]:  # 跳过前两列('No' 和 'uuid')
        if train[col].dtype == object:
            # 合并训练集和测试集的类别
            combined_data = pd.concat([train[col], test[col]])
            le = LabelEncoder()
            combined_data = le.fit_transform(combined_data)
            train[col] = combined_data[:len(train)]
            test[col] = combined_data[len(train):]
            label_encoders[col] = le  # 保存编码器以备后用
    
    # 检查测试集中非数值类型的特征
    non_numeric_cols = test.select_dtypes(include=['object']).columns.tolist()
    
    # 处理非数值类型的特征
    for col in non_numeric_cols:
        # 如果该特征应该在模型中,确保它是数值类型的
        if col in train.columns[2:]:
            # 尝试将字符串转换为数值类型
            test[col] = pd.to_numeric(test[col], errors='coerce')
    
    # 确保测试集中没有缺失值
    test = test.fillna(0)
    
    # 重新训练模型并预测
    rf_model.fit(X_train, y_train)
    pred = rf_model.predict(test.iloc[:, 1:].values)
    result = pd.DataFrame({'uuid': test['uuid'], 'Label': pred})
    
    # 4. 加载随机森林模型进行训练
    X_train = train.iloc[:, 2:].values
    y_train = train['Label'].values
    X_test = test.iloc[:, 1:].values
    
    # 4. 特征选择
    # 使用随机森林模型进行特征选择
    selector = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42))
    selector.fit(X_train, y_train)
    X_train_selected = selector.transform(X_train)
    X_test_selected = selector.transform(X_test)
    
    # 5. 模型调优
    # 定义随机森林模型的参数网格
    param_grid = {
        'n_estimators': [100, 200, 300],
        'max_depth': [None, 10, 20, 30],
        'min_samples_split': [2, 5, 10],
    }
    
    # 使用网格搜索进行模型调优
    rf_model = RandomForestClassifier(random_state=42)
    grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5)
    grid_search.fit(X_train_selected, y_train)
    
    # 获取最佳参数模型
    best_rf_model = grid_search.best_estimator_
    # 6. 使用最佳模型进行预测
    pred = best_rf_model.predict(X_test_selected)
    result = pd.DataFrame({'uuid': test['uuid'], 'Label': pred})
    
    # # 5. 使用模型进行预测并保存结果
    # pred = rf_model.predict(X_test)
    # result = pd.DataFrame({'uuid': test['uuid'], 'Label': pred})
    
    # 保存结果文件到本地
    result.to_csv('submit_rf.csv', index=False) 
    # 0.74296
    

  •  

网站公告

今日签到

点亮在社区的每一天
去签到