ML之xgboost:利用xgboost算法(特征筛选和GridSearchCV)对数据集实现回归预测

简介: ML之xgboost:利用xgboost算法(特征筛选和GridSearchCV)对数据集实现回归预测

输出结

['EnterCOD', 'EnterBOD', 'EnterAD', 'EnterZL', 'EnterZD', 'EnterPH', 'EnterSS', 'M4', 'N4', 'O4', 'P4', 'Q4', 'R4']

  EnterCOD  EnterBOD  EnterAD  EnterZL  EnterZD  EnterPH  EnterSS      M4  \

0     299.0       0.0     16.7     9.63     26.5        7    354.0  4609.0  

1     331.0       0.0     15.0     9.34     31.8        7    297.5  4834.0  

2     326.0       0.0     19.6    11.17     33.5        7    389.5  4928.0  

3     230.0       0.0     17.4     6.23     32.3        7    277.5  5073.0  

4     149.0       0.0     16.8     3.59     23.7        7    106.0  4856.0  

      N4    O4    P4     Q4    R4  

0  2346.0  1.72  32.0  69.43  17.0  

1  2434.0  1.72  34.0  70.34  18.0  

2  2604.0  1.70  35.0  71.02  18.0  

3  2678.0  1.68  36.0  70.96  19.0  

4  2452.0  1.69  37.0  76.19  19.0  

mlss准确率: 0.950752699205583

特征: Index(['EnterCOD', 'EnterBOD', 'EnterAD', 'EnterZL', 'EnterZD', 'EnterPH',

      'EnterSS', 'M4', 'N4', 'O4', 'P4', 'Q4', 'R4'],

     dtype='object')

每个特征的重要性: [100.        21.307432  48.90534   37.218624  26.950356   2.081406

 31.82239   72.88005   49.49121   61.9334    19.071848  33.441257

 17.745914]

mlss选取重要特征后准确率: 0.9485146037853682

重要特征: Index(['EnterCOD', 'M4', 'O4', 'N4', 'EnterAD', 'EnterZL', 'Q4', 'EnterSS',

      'EnterZD', 'EnterBOD', 'P4', 'R4'],

     dtype='object')

每个重要特征的重要性: [100.        92.00673   75.79092   55.387436  36.038513  32.217636

 42.442307  28.243927  24.789852  12.685312  18.707016  19.150238]


 

设计思

 

#ML之xgboost:利用xgboost算法(特征筛选和GridSearchCV)对数据集实现回归预测

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from sklearn import metrics

import pickle

from xgboost.sklearn import XGBRegressor

from sklearn.preprocessing import StandardScaler

from clean_data import prep_water_data, normalize_water_data, normalize_data, delete_null_date

from sklearn.model_selection import KFold, train_test_split, GridSearchCV, cross_val_score

from sklearn.model_selection import TimeSeriesSplit

def GDBTTrain(X, y):

   """xgboost用法"""

   train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=0)  ##test_size测试集合所占比例

   test_preds = pd.DataFrame({"label": test_y})

   clf = XGBRegressor(

       learning_rate=0.1,  # 默认0.3

       n_estimators=400,  # 树的个数

       max_depth=8,

   )

   clf.fit(train_x, train_y)

   test_preds['y_pred'] = clf.predict(test_x)

   stdm = metrics.r2_score(test_preds['label'], test_preds['y_pred'])

 

   # GridSearchCV和cross_val_score的结果一样

#     scores = cross_val_score(clf, X, y, scoring='r2')

#     print(scores)

#     gs = GridSearchCV(clf, {}, cv=3, verbose=3).fit(X, y)

   return stdm, clf

def XGTSearch(X, y):

   print("Parameter optimization")

   n_estimators = [50, 100, 200, 400]

   max_depth = [2, 4, 6, 8]

   learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]

   param_grid = dict(max_depth=max_depth, n_estimators=n_estimators, learning_rate=learning_rate)

   xgb_model = XGBRegressor()

   kfold = TimeSeriesSplit(n_splits=2).get_n_splits([X, y])

   fit_params = {"eval_metric": "rmse"}

   grid_search = GridSearchCV(xgb_model, param_grid, verbose=1, fit_params=fit_params, cv=kfold)

   grid_result = grid_search.fit(X, y)

   # summarize results

   print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

   means = grid_result.cv_results_['mean_test_score']

   stds = grid_result.cv_results_['std_test_score']

   params = grid_result.cv_results_['params']

   for mean, stdev, param in zip(means, stds, params):

       print("%f (%f) with: %r" % (mean, stdev, param))

   return means, grid_result

feature_string = 'EnterCOD  EnterBOD    EnterAD EnterZL EnterZD EnterPH EnterSS  M4 N4  O4  P4  Q4  R4' # 选取的特征

outputs_string = 'mlss  mlvss   sv30 OutCOD OutBOD  OutAD   OutZL   OutZD   OutPH   OutSS' # 需要预测的标签

feature = feature_string.split()

outputs = outputs_string.split()

print(feature)

def prep_water_data(data, columns):

   for c in columns:

       data[c] = [0 if ((x in ['Not Available', 'Not Mapped', 'NULL']) | (pd.isnull(x))) else x for x in data[c]]

   return data

def delete_null_date(data, date_name):

   data = data[data[date_name].notnull()]  # 删除日期存在缺失的数据

   return data

data = pd.read_csv('water_a.csv', encoding="gb18030")

data = prep_water_data(data, feature)

print(data.iloc[:5][feature])

def predict(data, out):

   data = delete_null_date(data, out)

   y = data[out]

   # y = y.as_matrix()

   X = data[feature]

   stdm, clf = GDBTTrain(X, y)

   print(out +'准确率:', stdm)

 

   feature_importance = clf.feature_importances_

   feature_importance = 100.0 * (feature_importance / feature_importance.max())

   print('特征:', X.columns)

   print('每个特征的重要性:', feature_importance)

   sorted_idx = np.argsort(feature_importance)

   pos = np.arange(sorted_idx.shape[0])

   plt.barh(pos, feature_importance[sorted_idx], align='center')

   plt.yticks(pos, X.columns[sorted_idx])

   plt.xlabel('Features')

   plt.ylabel('Importance')

   plt.title('Variable Importance')

   plt.show()

 

   #.......................选取重要性高的特征再次进行训练和预测..................................#

   X = data[X.columns[sorted_idx][::-1][:-1]]

   stdm, clf = GDBTTrain(X, y)

   print(out +'选取重要特征后准确率:', stdm)

 

   feature_importance = clf.feature_importances_

   feature_importance = 100.0 * (feature_importance / feature_importance.max())

   print('重要特征:', X.columns)

   print('每个重要特征的重要性:', feature_importance)

   sorted_idx = np.argsort(feature_importance)

   pos = np.arange(sorted_idx.shape[0])

   plt.barh(pos, feature_importance[sorted_idx], align='center')

   plt.yticks(pos, X.columns[sorted_idx])

   plt.xlabel('Features')

   plt.ylabel('Importance')

   plt.title('重要特征 Variable Importance')

   plt.show()

 

for out in outputs[:1]:

   sorted_idx = predict(data, out)


 

核心代

 

#ML之xgboost:利用xgboost算法(特征筛选和GridSearchCV)对数据集实现回归预测

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from sklearn import metrics

import pickle

from xgboost.sklearn import XGBRegressor

from sklearn.preprocessing import StandardScaler

from clean_data import prep_water_data, normalize_water_data, normalize_data, delete_null_date

from sklearn.model_selection import KFold, train_test_split, GridSearchCV, cross_val_score

from sklearn.model_selection import TimeSeriesSplit

def GDBTTrain(X, y):

   """xgboost用法"""

   train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=0)  ##test_size测试集合所占比例

   test_preds = pd.DataFrame({"label": test_y})

   clf = XGBRegressor(

       learning_rate=0.1,  # 默认0.3

       n_estimators=400,  # 树的个数

       max_depth=8,

   )

   clf.fit(train_x, train_y)

   test_preds['y_pred'] = clf.predict(test_x)

   stdm = metrics.r2_score(test_preds['label'], test_preds['y_pred'])

 

   # GridSearchCV和cross_val_score的结果一样

#     scores = cross_val_score(clf, X, y, scoring='r2')

#     print(scores)

#     gs = GridSearchCV(clf, {}, cv=3, verbose=3).fit(X, y)

   return stdm, clf

def XGTSearch(X, y):

   print("Parameter optimization")

   n_estimators = [50, 100, 200, 400]

   max_depth = [2, 4, 6, 8]

   learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]

   param_grid = dict(max_depth=max_depth, n_estimators=n_estimators, learning_rate=learning_rate)

   xgb_model = XGBRegressor()

   kfold = TimeSeriesSplit(n_splits=2).get_n_splits([X, y])

   fit_params = {"eval_metric": "rmse"}

   grid_search = GridSearchCV(xgb_model, param_grid, verbose=1, fit_params=fit_params, cv=kfold)

   grid_result = grid_search.fit(X, y)

   # summarize results

   print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

   means = grid_result.cv_results_['mean_test_score']

   stds = grid_result.cv_results_['std_test_score']

   params = grid_result.cv_results_['params']

   for mean, stdev, param in zip(means, stds, params):

       print("%f (%f) with: %r" % (mean, stdev, param))

   return means, grid_result

feature_string = 'EnterCOD  EnterBOD    EnterAD EnterZL EnterZD EnterPH EnterSS  M4 N4  O4  P4  Q4  R4' # 选取的特征

outputs_string = 'mlss  mlvss   sv30 OutCOD OutBOD  OutAD   OutZL   OutZD   OutPH   OutSS' # 需要预测的标签

feature = feature_string.split()

outputs = outputs_string.split()

print(feature)

def prep_water_data(data, columns):

   for c in columns:

       data[c] = [0 if ((x in ['Not Available', 'Not Mapped', 'NULL']) | (pd.isnull(x))) else x for x in data[c]]

   return data

def delete_null_date(data, date_name):

   data = data[data[date_name].notnull()]  # 删除日期存在缺失的数据

   return data

data = pd.read_csv('water_a.csv', encoding="gb18030")

data = prep_water_data(data, feature)

print(data.iloc[:5][feature])

def predict(data, out):

   data = delete_null_date(data, out)

   y = data[out]

   # y = y.as_matrix()

   X = data[feature]

   stdm, clf = GDBTTrain(X, y)

   print(out +'准确率:', stdm)

 

   feature_importance = clf.feature_importances_

   feature_importance = 100.0 * (feature_importance / feature_importance.max())

   print('特征:', X.columns)

   print('每个特征的重要性:', feature_importance)

   sorted_idx = np.argsort(feature_importance)

   pos = np.arange(sorted_idx.shape[0])

   plt.barh(pos, feature_importance[sorted_idx], align='center')

   plt.yticks(pos, X.columns[sorted_idx])

   plt.xlabel('Features')

   plt.ylabel('Importance')

   plt.title('Variable Importance')

   plt.show()

 

   #.......................选取重要性高的特征再次进行训练和预测..................................#

   X = data[X.columns[sorted_idx][::-1][:-1]]

   stdm, clf = GDBTTrain(X, y)

   print(out +'选取重要特征后准确率:', stdm)

 

   feature_importance = clf.feature_importances_

   feature_importance = 100.0 * (feature_importance / feature_importance.max())

   print('重要特征:', X.columns)

   print('每个重要特征的重要性:', feature_importance)

   sorted_idx = np.argsort(feature_importance)

   pos = np.arange(sorted_idx.shape[0])

   plt.barh(pos, feature_importance[sorted_idx], align='center')

   plt.yticks(pos, X.columns[sorted_idx])

   plt.xlabel('Features')

   plt.ylabel('Importance')

   plt.title('重要特征 Variable Importance')

   plt.show()

 

for out in outputs[:1]:

   sorted_idx = predict(data, out)


相关文章
|
1月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的XGBoost序列预测算法matlab仿真
基于WOA优化XGBoost的序列预测算法,利用鲸鱼优化算法自动寻优超参数,提升预测精度。结合MATLAB实现,适用于金融、气象等领域,具有较强非线性拟合能力,实验结果表明该方法显著优于传统模型。(238字)
|
3月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真
本程序基于Matlab 2024b实现,结合粒子群优化(PSO)与XGBoost算法,用于时间序列预测。通过PSO优化XGBoost超参数,提升预测精度。程序包含完整注释与操作视频,运行后生成预测效果图及性能评估指标RMSE。
|
6月前
|
SQL 分布式计算 DataWorks
使用DataWorks PyODPS节点调用XGBoost算法
本文介绍如何在DataWorks中通过PyODPS3节点调用XGBoost算法完成模型训练与测试,并实现周期离线调度。主要内容包括:1) 使用ODPS SQL构建数据集;2) 创建PyODPS3节点进行数据处理与模型训练;3) 构建支持XGBoost的自定义镜像;4) 测试运行并选择对应镜像。适用于需要集成机器学习算法到大数据工作流的用户。
252 24
|
12月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1143 6
|
10月前
|
机器学习/深度学习 算法 数据可视化
利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类
本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。
875 70
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
299 2
|
机器学习/深度学习 算法
【Deepin 20系统】机器学习分类算法模型xgboost、lightgbm、catboost安装及使用
介绍了在Deepin 20系统上使用pip命令通过清华大学镜像源安装xgboost、lightgbm和catboost三个机器学习分类算法库的过程。
420 4
|
机器学习/深度学习 数据采集 算法
Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战
Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战

热门文章

最新文章