机器学习基础术语
学习机器学习就像学习一门新语言,需要先掌握基本词汇。这些术语构成了机器学习的"语言系统",理解它们是深入学习的第一步。
想象一下你在教一个机器人认识水果:
- 数据 :各种水果的图片和信息
- 特征 :水果的颜色、形状、大小、味道
- 标签 :这个水果叫什么名字(苹果、香蕉、橙子)
- 模型 :机器人学到的"识别水果的方法"
- 训练 :教机器人认识水果的过程
- 推理 :机器人识别新水果的能力
数据(Data)
什么是数据?
数据 是机器学习的"原材料",就像厨师做菜需要的食材一样。没有数据,机器学习就无法进行。
数据的类型
1. 结构化数据
特点 :有明确的格式和组织方式,像表格一样整齐
# 结构化数据示例:学生信息表importpandasaspdstudents_data={'姓名':['张三','李四','王五'],'年龄':[18,19,20],'成绩':[85,92,78],'班级':['一班','二班','一班']}df=pd.DataFrame(students_data)print(df)
输出 :
姓名 年龄 成绩 班级 0 张三 18 85 一班 1 李四 19 92 二班 2 王五 20 78 一班
2. 非结构化数据
特点 :没有固定格式,需要特殊处理
例子 :
- 文本:评论、文章、邮件
- 图像:照片、医学影像
- 音频:语音、音乐
- 视频:监控录像、电影
# 非结构化数据示例:文本和图像 text_data = "这个产品质量很好,我很满意!" # image_data = 一张产品的照片 # audio_data = 顾客的语音评价
数据质量的重要性
垃圾进,垃圾出 (Garbage In, Garbage Out)是机器学习的重要原则。数据质量直接决定模型效果。
# 数据质量问题示例importnumpyasnpimportpandasaspd# 创建包含各种问题的数据problematic_data={'价格':[100,200,None,300,-50],# 缺失值和异常值'评分':[4.5,'好',3.8,4.2,5.0],# 数据类型不一致'销量':[1000,1200,800,1500,'很多']# 文本和数字混合}df=pd.DataFrame(problematic_data)print("有问题的数据:")print(df)print("\n数据问题分析:")print(f"缺失值数量:{df.isnull().sum().sum()}")print(f"数据类型:\n{df.dtypes}")
特征(Feature)
什么是特征?
特征 是数据的"可观察属性",就像描述一个人的特征:身高、体重、发色、性格等。在机器学习中,特征是用来做预测的依据。
特征选择的重要性 :
- 好的特征能让模型事半功倍
- 坏的特征会让模型事倍功半
- 特征工程往往是决定模型效果的关键
特征的类型
x1. 数值特征
特点 :可以用数字表示,可以进行数学运算
# 数值特征示例
numerical_features = {
'年龄': [25, 30, 35, 40],
'收入': [5000, 8000, 12000, 15000],
'身高': [165, 170, 175, 180]
}
2. 类别特征
特点 :表示不同的类别,不能进行数学运算
# 类别特征示例
categorical_features = {
'性别': ['男', '女', '男', '女'],
'学历': ['本科', '硕士', '博士', '本科'],
'城市': ['北京', '上海', '广州', '深圳']
}
3. 文本特征
特点 :需要特殊处理才能被模型使用
# 文本特征示例
text_features = {
'评论': [
'这个产品很好用,推荐购买!',
'质量一般,不太满意。',
'性价比高,值得入手。'
]
}
特征工程示例
# 特征工程示例:从原始数据创建有用特征importpandasaspdimportnumpyasnp# 原始数据:房屋信息house_data={'面积':[80,120,60,150,90],'卧室数':[2,3,1,4,2],'建造年份':[2000,2010,1995,2015,2005],'价格':[200,350,150,500,280]}df=pd.DataFrame(house_data)# 创建新特征df['房龄']=2023- df['建造年份']# 房屋年龄df['每平米价格']=df['价格']/ df['面积']# 单价df['卧室面积比']=df['卧室数']/ df['面积']*100# 卧室占比print("原始数据 + 新特征:")print(df)# 特征重要性分析correlation=df.corr()['价格'].sort_values(ascending=False)print("\n特征与价格的相关性:")print(correlation)
标签(Label)
什么是标签?
标签 是我们想要预测的"答案",就像考试题的正确答案一样。在监督学习中,每个数据样本都有一个对应的标签。
标签的作用 :
- 指导模型学习方向
- 评估模型学习效果
- 定义问题的类型
标签的类型
1. 分类标签
特点 :离散的类别值
# 分类标签示例
classification_labels = {
'邮件类型': ['垃圾邮件', '正常邮件', '垃圾邮件', '正常邮件'],
'情感倾向': ['正面', '负面', '中性', '正面'],
'疾病诊断': ['患病', '健康', '健康', '患病']
}
2. 回归标签
特点 :连续的数值
# 回归标签示例
regression_labels = {
'房价': [250000, 320000, 180000, 450000],
'温度': [25.5, 28.3, 22.1, 30.0],
'股票价格': [100.5, 105.2, 98.7, 110.3]
}
标签质量的重要性
# 标签质量问题示例
import numpy as np
# 模拟图像分类任务中的标签问题
image_data = ['cat1.jpg', 'dog1.jpg', 'cat2.jpg', 'dog2.jpg']
problematic_labels = ['猫', '犬', '猫咪', '狗'] # 标签不一致
# 标签标准化
label_mapping = {
'猫': 'cat', '猫咪': 'cat',
'犬': 'dog', '狗': 'dog'
}
standardized_labels = [label_mapping[label] for label in problematic_labels]
print("原始标签:", problematic_labels)
print("标准化标签:", standardized_labels)
模型(Model)
什么是模型?
模型 是机器学习算法从数据中学到的"规律"或"模式",就像学生从课本中学到的知识一样。
模型的本质 :
- 数学函数:输入特征,输出预测
- 参数集合:学到的规律的具体表示
- 决策规则:如何从输入得到输出
模型的表示
# 简单线性模型示例importnumpyasnpimportmatplotlib.pyplotasplt# 模拟数据X=np.array([1,2,3,4,5])y=np.array([2,4,6,8,10])# 线性模型:y = w * x + b# 学习到的参数:w = 2, b = 0w,b=2,0deflinear_model(x):"""线性模型函数"""returnw * x + b# 预测predictions=linear_model(X)# 可视化plt.scatter(X,y,color='blue',label='真实数据')plt.plot(X,predictions,color='red',label='模型预测')plt.xlabel('输入 X')plt.ylabel('输出 y')plt.title('线性模型示例')plt.legend()plt.grid(True)plt.show()print(f"模型参数:w = {w}, b = {b}")print(f"预测结果:{predictions}")
模型的复杂度
# 模型复杂度对比fromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegressionimportnumpyasnp# 生成非线性数据np.random.seed(42)X=np.random.rand(20,1)*10y=np.sin(X)+ np.random.randn(20,1)*0.1# 简单模型(线性)simple_model=LinearRegression()simple_model.fit(X,y)# 复杂模型(高次多项式)poly_features=PolynomialFeatures(degree=10)X_poly=poly_features.fit_transform(X)complex_model=LinearRegression()complex_model.fit(X_poly,y)# 可视化X_test=np.linspace(0,10,100).reshape(-1,1)X_test_poly=poly_features.transform(X_test)plt.scatter(X,y,color='blue',label='训练数据')plt.plot(X_test,simple_model.predict(X_test),color='green',label='简单模型')plt.plot(X_test,complex_model.predict(X_test_poly),color='red',label='复杂模型')plt.xlabel('X')plt.ylabel('y')plt.title('模型复杂度对比')plt.legend()plt.grid(True)plt.show()
训练(Training)
什么是训练?
训练 是模型学习的过程,就像学生上课学习知识一样。在训练过程中,模型不断调整参数,使预测结果越来越接近真实标签。
训练过程示例
# 训练过程示例:简单线性回归importnumpyasnpimportmatplotlib.pyplotasplt# 生成训练数据np.random.seed(42)X=np.random.rand(50,1)*10y=3* X +2+ np.random.randn(50,1)*2# 初始化模型参数w,b=0.0,0.0learning_rate=0.01epochs=100# 记录训练过程loss_history=[]# 训练循环forepochinrange(epochs):# 前向传播y_pred=w * X + b# 计算损失(均方误差)loss=np.mean((y_pred - y)**2)loss_history.append(loss)# 计算梯度dw=np.mean(2* X *(y_pred - y))db=np.mean(2*(y_pred - y))# 更新参数w -=learning_rate * dwb -=learning_rate * dbifepoch %10==0:print(f"Epoch {epoch}: Loss = {loss:.4f}, w = {w:.4f}, b = {b:.4f}")# 可视化训练过程plt.figure(figsize=(12,4))plt.subplot(1,2,1)plt.plot(loss_history)plt.xlabel('Epoch')plt.ylabel('Loss')plt.title('训练损失变化')plt.grid(True)plt.subplot(1,2,2)plt.scatter(X,y,color='blue',label='训练数据')plt.plot(X,w * X + b,color='red',label='训练后的模型')plt.xlabel('X')plt.ylabel('y')plt.title('训练结果')plt.legend()plt.grid(True)plt.tight_layout()plt.show()print(f"最终模型参数:w = {w:.4f}, b = {b:.4f}")
推理(Inference)
什么是推理?
推理 是使用训练好的模型进行预测的过程,就像学生用学到的知识解答考试题一样。
推理过程示例
# 推理过程示例importnumpyasnp# 假设我们已经训练好了一个房价预测模型classHousePriceModel:def__init__(self):# 模拟训练好的参数self.feature_weights={'面积':2.5,'卧室数':10.0,'房龄': -1.0,'地段评分':50.0}self.bias=50.0defpredict(self,features):"""使用训练好的模型进行房价预测"""price=self.biasforfeature_name,feature_valueinfeatures.items():iffeature_nameinself.feature_weights:price +=self.feature_weights[feature_name]* feature_valuereturnprice# 创建训练好的模型model=HousePriceModel()# 推理:预测新房价new_houses=[{'面积':80,'卧室数':2,'房龄':5,'地段评分':8},{'面积':120,'卧室数':3,'房龄':2,'地段评分':9},{'面积':60,'卧室数':1,'房龄':10,'地段评分':6}]print("房价预测结果:")fori,houseinenumerate(new_houses,1):predicted_price=model.predict(house)print(f"房子{i}:预测价格 {predicted_price:.2f} 万元")# 批量推理defbatch_predict(model,house_list):"""批量预测"""return[model.predict(house)forhouseinhouse_list]batch_prices=batch_predict(model,new_houses)print(f"\n批量预测结果:{batch_prices}")
完整示例:从数据到推理
# 完整的机器学习流程示例importnumpyasnpimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error,r2_score# 1. 数据准备np.random.seed(42)n_samples=200# 生成特征数据area=np.random.normal(100,30,n_samples)# 面积bedrooms=np.random.randint(1,5,n_samples)# 卧室数age=np.random.randint(0,20,n_samples)# 房龄location_score=np.random.randint(1,10,n_samples)# 地段评分# 生成标签(房价)- 基于特征的线性组合加噪声price=(area *2.5+ bedrooms *20+ age * -2+ location_score *15+np.random.normal(0,50,n_samples))# 创建数据框data=pd.DataFrame({'面积': area,'卧室数': bedrooms,'房龄': age,'地段评分': location_score,'价格': price})print("数据示例:")print(data.head())# 2. 划分训练集和测试集features=['面积','卧室数','房龄','地段评分']X=data[features]y=data['价格']X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)print(f"\n训练集大小:{X_train.shape[0]}")print(f"测试集大小:{X_test.shape[0]}")# 3. 训练模型model=LinearRegression()model.fit(X_train,y_train)print(f"\n模型参数:")forfeature,coefinzip(features,model.coef_):print(f"{feature}: {coef:.2f}")print(f"截距: {model.intercept_:.2f}")# 4. 评估模型y_train_pred=model.predict(X_train)y_test_pred=model.predict(X_test)train_mse=mean_squared_error(y_train,y_train_pred)test_mse=mean_squared_error(y_test,y_test_pred)train_r2=r2_score(y_train,y_train_pred)test_r2=r2_score(y_test,y_test_pred)print(f"\n模型评估:")print(f"训练集 MSE: {train_mse:.2f}, R²: {train_r2:.2f}")print(f"测试集 MSE: {test_mse:.2f}, R²: {test_r2:.2f}")# 5. 推理(预测新数据)new_houses=pd.DataFrame({'面积':[85,120,65],'卧室数':[2,3,1],'房龄':[3,1,8],'地段评分':[7,9,5]})predictions=model.predict(new_houses)print(f"\n新房价预测:")fori,priceinenumerate(predictions,1):print(f"房子{i}: {price:.2f} 万元")
常见机器学习网络类型
| 模型类型 | 中文全称 | 英文简写 | 核心适用场景 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 传统机器学习 | 决策树 | DT | 分类、回归、特征重要性分析 | 可解释性强,无需数据归一化 | 易过拟合,对噪声敏感 |
| 随机森林 | RF | 分类、回归、异常检测 | 抗过拟合,稳定性高 | 高维数据下计算成本高 | |
| 逻辑回归 | LR | 二分类、概率预测 | 训练快,可解释性强 | 难以拟合非线性关系 | |
| 支持向量机 | SVM | 分类、高维小样本数据 | 泛化能力强,适合特征维度高的场景 | 对大规模数据训练慢,调参复杂 | |
| 朴素贝叶斯 | NB | 文本分类、垃圾邮件识别 | 训练速度极快,对缺失数据不敏感 | 假设特征独立,实际场景中可能不成立 | |
| XGBoost | XGBoost | 分类、回归、竞赛级任务 | 精度高,支持并行计算,自带正则化 | 容易过拟合,对超参数敏感 | |
| LightGBM | LightGBM | 大规模数据分类、回归 | 训练速度快,内存占用低 | 小数据集上可能不如XGBoost稳定 | |
| 深度学习 | 人工神经网络 | ANN | 简单分类、回归任务 | 结构简单,易于理解 | 难以处理高维、复杂数据 |
| 卷积神经网络 | CNN | 图像识别、目标检测、视频分析 | 自动提取空间特征,参数共享 | 训练需要大量数据和计算资源 | |
| 循环神经网络 | RNN | 序列数据处理、文本生成 | 处理可变长度序列 | 存在梯度消失/爆炸问题,难以捕捉长依赖 | |
| 长短期记忆网络 | LSTM | 长序列文本翻译、语音识别 | 解决RNN长依赖问题 | 结构复杂,训练速度较慢 | |
| 门控循环单元 | GRU | 序列数据处理、情感分析 | 比LSTM结构简单,训练更快 | 长序列场景下性能略逊于LSTM | |
| 生成对抗网络 | GAN | 图像生成、风格迁移、数据增强 | 生成数据质量高,多样性强 | 训练不稳定,容易模式崩溃 | |
| Transformer | Transformer | 自然语言处理、多模态任务 | 并行计算效率高,捕捉长依赖能力强 | 计算成本高,小数据集上易过拟合 | |
| 自编码器 | AE | 数据压缩、异常检测、特征提取 | 无监督学习,结构简单 | 生成数据质量通常低于GAN | |
| 图神经网络 | GNN | 社交网络分析、分子结构预测 | 处理图结构数据,挖掘节点关系 | 训练难度大,对图结构预处理要求高 |