使用阿里云机器学习PAI做回归预测

简介: XGBoost是一种集成机器学习算法,能够处理分类和回归问题。它具有高准确性、鲁棒性、可解释性和可扩展性等优点。XGBoost的算法原理是集成多个决策树模型,每个模型都是在前一个模型的残差上进行训练。在训练过程中,XGBoost使用了一些技术来避免过拟合,例如正则化、剪枝和子采样。如果想要处理分类和回归问题,XGBoost是一个值得尝试的机器学习算法。

在DSW的Sample Notebook中,使用XGBoost回归算法预测房价。

XGBoost算法原理

XGBoost(eXtreme Gradient Boosting)是一种基于决策树集成学习算法的机器学习模型。它是由陈天奇在2016年提出的,经过不断的优化和改进,已成为了在机器学习竞赛中广泛使用的模型之一。XGBoost的特点是在GBDT(Gradient Boosting Decision Tree)算法的基础上,加入了正则化项和二阶导数信息,从而提高了模型的泛化能力和准确性。

XGBoost模型的预测函数可以表示为:

image.png

其中,K 表示决策树的数量,f_k(x_i) 表示第 k 棵树对样本 x_i 的预测值。为了使模型更加准确,XGBoost在GBDT的基础上,引入了正则化项和二阶导数信息,构建了如下的目标函数:

image.png

其中,l(y_i,\hat{y}_i) 表示预测值和真实值之间的损失函数,\Omega(f_k) 表示对决策树进行正则化的惩罚项。为了求解这个目标函数,XGBoost采用了梯度提升算法和加权最小二乘法进行优化。在每一轮迭代中,XGBoost根据当前模型的预测值和真实值之间的残差,构建一棵新的决策树,并根据正则化项和二阶导数信息对决策树进行剪枝和修剪,最终得到一个泛化能力更强的模型。

XGBoost的优点在于它既具有高准确性,又具有高效性。它能够处理大规模、高维度的数据集,并能够快速训练和预测。因此,它被广泛应用于各种机器学习任务,如分类、回归、排序、推荐等。

XGBoost的参数介绍

XGBoost的全部参数介绍比较详细,以下是常用参数的介绍:

通用超参数:

  • booster [default=gbtree]: 选择哪种booster,可选gbtree, gblinear或dart。
  • silent [default=0]: 是否在运行时输出运行信息。
  • nthread [default to maximum number of threads available if not set]: 用于运行XGBoost的线程数量。

增强器参数:

  • eta [default=0.3]: 学习率,控制每一步的权重缩减。
  • gamma [default=0]: 控制是否进行节点分裂的参数,只有分裂后损失函数得到显著下降,才会进行分裂。
  • max_depth [default=6]: 树的最大深度,避免过拟合。
  • min_child_weight [default=1]: 定义一个节点在分裂时所需的最小样本权重和。
  • max_delta_step [default=0]: 允许每个树的权重估计的最大增量步长,该参数可以帮助收敛速度,通常不需要调整。
  • subsample [default=1]: 训练模型时的子采样率。
  • colsample_bytree [default=1]: 在建立树时,对特征进行采样的比例。
  • colsample_bylevel [default=1]: 控制每个级别(深度)的列采样比例。
  • lambda [default=1]: 控制L2正则化项的权重。
  • alpha [default=0]: 控制L1正则化项的权重。
  • tree_method [default=auto]: 控制使用何种方法来构建树,可选exact、approx和hist。
  • scale_pos_weight [default=1]: 解决样本不平衡问题,将正样本的权重提高。

学习任务参数:

  • objective [default=reg:squarederror]: 目标函数,可选reg:squarederror(回归问题)、binary:logistic(二分类问题)或multi:softmax(多分类问题)等。
  • num_class [default=1]: 多分类问题的类别数量。
  • eval_metric [default according to objective]: 评估指标,根据目标函数自动选择。

以上是常用的参数介绍,XGBoost还有一些高级参数和调试参数,可根据实际需求进行设置。

创建DSW实例

image.png
image.png
image.png
image.png
image.png

导入三方库

import numpy as np  
import pandas as pd  
%matplotlib inline
import matplotlib.pyplot as plt   
import seaborn as sns
color = sns.color_palette()
sns.set_style('darkgrid')

import warnings
warnings.filterwarnings("ignore")


from scipy import stats
from scipy.stats import norm, skew  

pd.set_option('display.float_format', lambda x: '{:.3f}'.format(x))

数据清洗与预处理

# 加载数据
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

原始数据都会存在很多问题,不利于分析和训练,所以要清洗和预处理,比如去无关列,去重,缺失值处理,去极端值等。

#保存'Id'列
train_ID = train['Id']
test_ID = test['Id']

#删除'Id'列,因为它对于预测过程是不必要的。
train.drop("Id", axis = 1, inplace = True)
test.drop("Id", axis = 1, inplace = True)

# 删除GrLivArea特征值大于4000且SalePrice特征值小于300000的异常点
train = train.drop(train[(train['GrLivArea']>4000) & (train['SalePrice']<300000)].index)

# 对SalePrice特征使用np.log1p函数进行平滑处理,使其更接近标准正态分布。
train["SalePrice"] = np.log1p(train["SalePrice"])

# 将训练集(train)和测试集(test)按行合并,并删除合并后数据集(all_data)中的SalePrice特征。
ntrain = train.shape[0]
ntest = test.shape[0]
y_train = train.SalePrice.values
all_data = pd.concat((train, test)).reset_index(drop=True)
all_data.drop(['SalePrice'], axis=1, inplace=True)

# 计算all_data中每个特征的缺失率,取出前30个缺失率较高的特征,放在missing_data中。
all_data_na = (all_data.isnull().sum() / len(all_data)) * 100
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30]
missing_data = pd.DataFrame({'Missing Ratio' :all_data_na})

# 使用 "None" 来填充空值的特征
none_cols = ["PoolQC", "MiscFeature", "Alley", "Fence", "FireplaceQu", "GarageType",
             "GarageFinish", "GarageQual", "GarageCond", "BsmtQual", "BsmtCond",
             "BsmtExposure", "BsmtFinType1", "BsmtFinType2", "MasVnrType"]
for feature in none_cols:
    all_data[feature].fillna('None', inplace=True)

# 使用 0 来填充空值的特征
zero_cols = ["GarageYrBlt", "GarageArea", "GarageCars", "BsmtFinSF1", "BsmtFinSF2",
             "BsmtUnfSF", "TotalBsmtSF", "BsmtFullBath", "BsmtHalfBath", "MasVnrArea"]
for feature in zero_cols:
    all_data[feature].fillna(0, inplace=True)

# 使用中位数来填充空值的特征
all_data["LotFrontage"] = all_data.groupby("Neighborhood")["LotFrontage"].transform(
    lambda x: x.fillna(x.median()))

# 使用众数来填充空值的特征
mode_cols = ["MSZoning", "Electrical", "KitchenQual", "Exterior1st", "Exterior2nd", "SaleType"]
for feature in mode_cols:
    all_data[feature] = all_data[feature].fillna(all_data[feature].mode()[0])

# 删除 "Utilities" 特征
all_data = all_data.drop(["Utilities"], axis=1)

# 使用 "Typ" 来填充空值的特征
all_data["Functional"] = all

# 统计 all_data 中每个特征列的缺失值比例
all_data_na = (all_data.isnull().sum() / len(all_data)) * 100
# 选出所有缺失值比例为零的特征列的索引,并在 all_data_na 中将其从 DataFrame 中删除。
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)
# 根据 all_data_na 生成一个 missing_data
missing_data = pd.DataFrame({'Missing Ratio' :all_data_na})

# 类型转换
cols = ['MSSubClass', 'OverallCond', 'YrSold', 'MoSold']
all_data[cols] = all_data[cols].astype(str)

# 编码(encoding)
from sklearn.preprocessing import LabelEncoder
for c in all_data.columns:
    if all_data[c].dtype == 'object':
        lbl = LabelEncoder() 
        lbl.fit(list(all_data[c].values)) 
        all_data[c] = lbl.transform(list(all_data[c].values))

print('Shape all_data: {}'.format(all_data.shape))

# 根据相关的行业知识,创建新的feature
all_data['TotalSF'] = all_data['TotalBsmtSF'] + all_data['1stFlrSF'] + all_data['2ndFlrSF']

# 一共有多少个洗漱间
all_data['TotalBath'] = all_data[['BsmtFullBath','BsmtHalfBath','FullBath','HalfBath']].sum(axis=1)

# 门廊的面积
all_data['TotalPorchSF'] = all_data[['OpenPorchSF','EnclosedPorch','3SsnPorch','ScreenPorch','WoodDeckSF']].sum(axis=1)

# 计算feature的偏度
numeric_feats = all_data.dtypes[all_data.dtypes != "object"].index

skewed_feats = all_data[numeric_feats].apply(lambda x: skew(x.dropna())).sort_values(ascending=False)
print("\n数值类型feature的偏度: \n")
skewness = pd.DataFrame({'Skew' :skewed_feats})

# 对偏度大于0,75的进行平滑处理
skewness = skewness[abs(skewness) > 0.75]
print("一共有 {} 个feature需要处理".format(skewness.shape[0]))

from scipy.special import boxcox1p
skewed_features = skewness.index
lam = 0.15
for feat in skewed_features:
    all_data[feat] = boxcox1p(all_data[feat], lam)

all_data = pd.get_dummies(all_data)

# 产生最终的数据集
train = all_data[:ntrain]
test = all_data[ntrain:]

导入建模所需的包

from sklearn.kernel_ridge import KernelRidge
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import RobustScaler
from sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone
from sklearn.model_selection import KFold, cross_val_score, train_test_split
from sklearn.metrics import mean_squared_error
import xgboost as xgb

编制函数计算模型在训练集上的交叉验证准确率

# 参数:model: 训练好的模型,train: 训练数据,y_train: 目标变量
# 返回值:交叉验证得分列表
def get_accuracy(model,train,y_train):
    n_folds=7
    kf1 = KFold(n_folds, shuffle=True, random_state=42)
    kf_cv_scores = cross_val_score(model,train,y_train,cv=kf1)
    return kf_cv_scores

编制函数计算均方根对数误差

def rmsle(y, y_pred):
    return np.sqrt(mean_squared_error(y, y_pred))

使用XGBoost建立回归模型

model_xgb = xgb.XGBRegressor(colsample_bytree=0.4603, gamma=0.0468, 
                             learning_rate=0.05, max_depth=3, 
                             min_child_weight=1.7817, n_estimators=2200,
                             reg_alpha=0.4640, reg_lambda=0.8571,
                             subsample=0.5213, 
                             random_state =7, nthread = -1)

训练

model_xgb.fit(train, y_train)

XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
             colsample_bynode=1, colsample_bytree=0.4603,
             enable_categorical=False, gamma=0.0468, gpu_id=-1,
             importance_type=None, interaction_constraints='',
             learning_rate=0.05, max_delta_step=0, max_depth=3,
             min_child_weight=1.7817, missing=nan, monotone_constraints='()',
             n_estimators=2200, n_jobs=8, nthread=-1, num_parallel_tree=1,
             predictor='auto', random_state=7, reg_alpha=0.464,
             reg_lambda=0.8571, scale_pos_weight=1, subsample=0.5213,
             tree_method='exact', validate_parameters=1, verbosity=None)

kf_cv_scores = get_accuracy(model_xgb,train,y_train)
print("Average score: %.2f" % kf_cv_scores.mean())

结果

Average score: 0.92

打印其中一棵树的树结构

tree_struct = xgb.to_graphviz(model_xgb,num_trees=111)
tree_struct

image.png

相关实践学习
使用PAI+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
相关文章
|
8月前
|
PyTorch 调度 算法框架/工具
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
DLC任务Pytorch launch_agent Socket Timeout问题源码分析与解决方案
435 18
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
阿里云人工智能平台 PAI 开源 EasyDistill 框架助力大语言模型轻松瘦身
本文介绍了阿里云人工智能平台 PAI 推出的开源工具包 EasyDistill。随着大语言模型的复杂性和规模增长,它们面临计算需求和训练成本的障碍。知识蒸馏旨在不显著降低性能的前提下,将大模型转化为更小、更高效的版本以降低训练和推理成本。EasyDistill 框架简化了知识蒸馏过程,其具备多种功能模块,包括数据合成、基础和进阶蒸馏训练。通过数据合成,丰富训练集的多样性;基础和进阶蒸馏训练则涵盖黑盒和白盒知识转移策略、强化学习及偏好优化,从而提升小模型的性能。
|
8月前
|
缓存 并行计算 测试技术
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
2011 12
|
10月前
|
存储 人工智能 云栖大会
【云栖大会】阿里云设计中心 × 教育部协同育人项目成果展,PAI ArtLab助力高校AIGC教育新路径
【云栖大会】阿里云设计中心 × 教育部协同育人项目成果展,PAI ArtLab助力高校AIGC教育新路径
|
11月前
|
机器学习/深度学习 数据采集 人工智能
MATLAB在机器学习模型训练与性能优化中的应用探讨
本文介绍了如何使用MATLAB进行机器学习模型的训练与优化。MATLAB作为强大的科学计算工具,提供了丰富的函数库和工具箱,简化了数据预处理、模型选择、训练及评估的过程。文章详细讲解了从数据准备到模型优化的各个步骤,并通过代码实例展示了SVM等模型的应用。此外,还探讨了超参数调优、特征选择、模型集成等优化方法,以及深度学习与传统机器学习的结合。最后,介绍了模型部署和并行计算技巧,帮助用户高效构建和优化机器学习模型。
MATLAB在机器学习模型训练与性能优化中的应用探讨
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
云上一键部署通义千问 QwQ-32B 模型,阿里云 PAI 最佳实践
3月6日阿里云发布并开源了全新推理模型通义千问 QwQ-32B,在一系列权威基准测试中,千问QwQ-32B模型表现异常出色,几乎完全超越了OpenAI-o1-mini,性能比肩Deepseek-R1,且部署成本大幅降低。并集成了与智能体 Agent 相关的能力,够在使用工具的同时进行批判性思考,并根据环境反馈调整推理过程。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署 QwQ-32B,本实践带您部署体验专属 QwQ-32B模型服务。
|
9月前
|
人工智能 自然语言处理 运维
Qwen3 全尺寸模型支持通过阿里云PAI-ModelGallery 一键部署
Qwen3 是 Qwen 系列最新一代的大语言模型,提供了一系列密集(Dense)和混合专家(MOE)模型。目前,PAI 已经支持 Qwen3 全系列模型一键部署,用户可以通过 PAI-Model Gallery 快速开箱!
|
11月前
|
人工智能 自然语言处理 网络安全
基于阿里云 Milvus + DeepSeek + PAI LangStudio 的低成本高精度 RAG 实战
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
|
11月前
|
人工智能 监控 开发者
阿里云PAI发布DeepRec Extension,打造稳定高效的分布式训练,并宣布开源!
阿里云PAI发布DeepRec Extension,打造稳定高效的分布式训练,并宣布开源!
267 0
|
11月前
|
人工智能 自然语言处理 安全
基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统
基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统
247 0

相关产品

  • 人工智能平台 PAI