我们使用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%}")