从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%}")
相关推荐
镜象科技26 分钟前
职业院校AI心理健康解决方案怎么选?三个特殊场景与三类路线
人工智能
Leo.yuan38 分钟前
企业Data Agent架构选型:帆软Dora基于NL2BI的现有BI体系复用方案
大数据·人工智能
朱涛的自习室1 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
米小虾1 小时前
上下文:Agent 的眼睛里到底装着什么
人工智能·agent
米小虾1 小时前
Agent = 大脑 + 眼睛 + 手脚:一篇看懂现代 AI Agent 的骨架
人工智能
小小测试开发1 小时前
安全评测得分 0.9556 掉到 0.3257,只改了 top_k 和 prompt_style 之外的题面比例
人工智能·安全·prompt
slacker-kian2 小时前
[实践]-用LLM对文本结构化:把多段文本描述变成规范的 JSON 知识库
人工智能·llm·prompt·结构化·pydantic·one-shot 提示
品牌常新2 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人
冬奇Lab2 小时前
LLM 驱动的自动化测试系列(13):Flaky Test 不是重跑几次就能解决的分类问题
人工智能·测试