从XGBoost角度理解为什么要使用机器学习

我们使用Python和经典的鸢尾花(Iris)数据集 ,目标是根据花的长度和宽度数据,预测花的品种

用"笨办法"处理分类问题,其实就是在没有机器学习算法 的情况下,靠人工规则和统计来做判断。我以鸢尾花分类为例,给你展示几种"笨办法"。

🌸 笨办法:人工肉眼判断(基于规则)

鸢尾花数据集有4个特征,但其实花瓣长度花瓣宽度 两个特征就足够区分了。我们可以直接写if-else规则

复制代码
def predict_by_rules(sepal_len, sepal_wid, petal_len, petal_wid):
    """
    基于人工观察到的规律进行分类
    规则来源:看数据分布图总结出来的
    """
    # 山鸢尾(setosa)最明显:花瓣又短又窄
    if petal_len < 2.5:
        return "山鸢尾 (setosa)"
    
    # 剩下的两种:根据花瓣宽度区分
    if petal_wid < 1.8:
        return "变色鸢尾 (versicolor)"
    else:
        return "维吉尼亚鸢尾 (virginica)"

# 测试几个样本
test_samples = [
    [5.1, 3.5, 1.4, 0.2],  # 明显是山鸢尾
    [6.0, 2.9, 4.5, 1.5],  # 变色鸢尾
    [6.5, 3.0, 5.5, 2.1],  # 维吉尼亚鸢尾
]

for sample in test_samples:
    result = predict_by_rules(*sample)
    print(f"特征: {sample} -> 预测: {result}")

优点 :简单、可解释性强

缺点:规则靠经验,边界模糊时容易出错;如果特征很多(比如100个),规则会复杂到写不出来。

但是,使用机器学习,来解决:

复制代码
import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = xgb.XGBClassifier(n_estimators=100, max_depth=3, learning_rate=0.1,
                          objective='multi:softmax', num_class=3, random_state=42)
model.fit(X_train, y_train)

# 预测与评估
y_pred = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_pred):.2f}")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

❤:加载100条数据,其中70用来训练,30条用来测试。

无论训练还是测试,都需要:特征+标签。也就是 X和y

训练的数据(X_train,y_train)训练结束之后,再用训练的结果来对测试特征,计算出"预测测试特性",这个"预测测试特性"和测试特征y_test做比较,看最后的预测是否成功率高。如果很高,就可以使用。

模型训练完之后怎么用?

很多人初学机器学习时都会卡在这一步------训练完模型后,不知道怎么在实际中应用。我来给你完整展示从训练到部署使用的全过程。


🎯 核心思路:保存模型 → 加载模型 → 预测新数据

模型训练完成后,不能每次都重新训练(太耗时),而是把训练好的模型保存下来 ,以后直接加载使用


📦 方法:使用 pickle(Python原生,最常用)

第一步:训练并保存模型

复制代码
import pickle
import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 1. 训练模型(和之前一样)
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=42
)

model = xgb.XGBClassifier(n_estimators=100, max_depth=3, random_state=42)
model.fit(X_train, y_train)

# 2. 保存模型到文件
with open('iris_model.pkl', 'wb') as f:
    pickle.dump(model, f)

print("模型已保存为 iris_model.pkl")

第二步:在新场景中加载并使用

复制代码
import pickle
import numpy as np

# 1. 加载模型
with open('iris_model.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

# 2. 用模型预测新数据
# 假设这是你新采集的一朵花的数据:[花萼长, 花萼宽, 花瓣长, 花瓣宽]
new_flowers = [
    [5.1, 3.5, 1.4, 0.2],   # 新样本1
    [6.7, 3.1, 4.7, 1.5],   # 新样本2
    [7.2, 3.6, 6.1, 2.5],   # 新样本3
]

# 批量预测
predictions = loaded_model.predict(new_flowers)

# 将数字标签转为品种名称
species = {0: '山鸢尾', 1: '变色鸢尾', 2: '维吉尼亚鸢尾'}
for i, pred in enumerate(predictions):
    print(f"样本{i+1}: {new_flowers[i]} -> 预测品种: {species[pred]}")

# 如果想看预测概率(更丰富的信息)
probabilities = loaded_model.predict_proba(new_flowers)
print("\n预测概率详情:")
for i, prob in enumerate(probabilities):
    print(f"样本{i+1}: 山鸢尾{prob[0]:.2%}, 变色鸢尾{prob[1]:.2%}, 维吉尼亚鸢尾{prob[2]:.2%}")
相关推荐
tachibana217 分钟前
如何设计多 Agent 的协作与动态切换机制?
网络·人工智能·ai·大模型·llm·agent
jkyy201420 分钟前
从娱乐座舱到健康服务空间:重构智能出行的主动守护范式
大数据·人工智能·健康医疗
啊阿狸不会拉杆29 分钟前
《计算机网络-自顶向下方法》1.3 网络核心 读书笔记
网络·人工智能·计算机网络·ai·php
Dawson Zhu34 分钟前
Agent 工具体系:从 MCP 协议到层次化工具发现
人工智能·语言模型·架构·aigc·agi
星核0penstarry36 分钟前
三款Flash模型横向对比:GLM-5.3、DeepSeek-V4、Qwen3.8怎么选?
人工智能·qwen·flash·glm-5.3·deepseek-·横向测评
DeepAgent39 分钟前
AI Agent 工程实践(39):第一次实现——先做一个最小 Agent
大数据·人工智能·agent
茉莉玫瑰花茶1 小时前
RAG 数据检索
人工智能·算法·机器学习
土拨鼠6181 小时前
Harness vs 原生 ReAct Agent 对比
人工智能
Zentceh1 小时前
全彩夜视 vs 黑白夜视:信息密度、AI识别准确率对比
人工智能·科技·计算机视觉·车载系统·无人机·量子计算·视频