🎈边走、边悟🎈迟早会好 |
一、概念
机器学习是一种利用数据来改进模型性能的计算方法,属于人工智能的一个分支。它旨在让计算机系统通过经验自动改进,而不需要明确编程。
类型
- 监督学习:使用带标签的数据进行训练,包括分类(如垃圾邮件检测)和回归(如房价预测)。
- 无监督学习:使用不带标签的数据进行训练,包括聚类(如客户细分)和降维(如主成分分析)。
- 强化学习:通过与环境的交互学习策略,以最大化累积奖励(如AlphaGo)。
二、 常见算法
2.1监督学习算法
- 线性回归:用于回归任务,假设目标变量与输入特征之间存在线性关系。
- 逻辑回归:用于二分类任务,输出一个介于0和1之间的概率。
- 决策树:树状结构的模型,易于理解和解释。
- 支持向量机(SVM):寻找能够最大化类间间隔的决策边界。
- K近邻(KNN):基于距离度量的简单算法,预测时考虑最近的K个邻居。
- 朴素贝叶斯:基于贝叶斯定理的分类算法,假设特征之间条件独立。
2.2无监督学习算法
- K均值聚类:将数据分成K个簇,使得簇内数据的相似度最大。
- 层次聚类:构建一个层次结构的聚类树,逐步合并或分割簇。
- 主成分分析(PCA):将高维数据投影到低维空间,保留数据的主要变异信息。
- 独立成分分析(ICA):类似于PCA,但假设数据成分相互独立。
2.3强化学习算法
- Q学习:基于状态-动作对的值函数,通过Q值迭代更新策略。
- 深度Q网络(DQN):结合深度学习的Q学习算法,用神经网络近似Q值。
- 策略梯度方法:直接优化策略,使得期望奖励最大化。
三.、模型评估
评估指标
分类:
- 准确率:正确预测的样本数占总样本数的比例。
- 精确率:预测为正类的样本中实际为正类的比例。
- 召回率:实际为正类的样本中被正确预测为正类的比例。
- F1分数:精确率和召回率的调和平均数。
- 混淆矩阵:总结预测结果的矩阵,显示真阳性、假阳性、真阴性和假阴性。
回归:
- 均方误差(MSE):预测值与真实值之差的平方和的平均数。
- 均方根误差(RMSE):MSE的平方根。
- 平均绝对误差(MAE):预测值与真实值之差的绝对值的平均数。
- R²:解释回归模型对数据变异的比例。
交叉验证
通过将数据集划分为若干子集,反复进行训练和验证,以评估模型的性能稳定性和泛化能力。
四、 优化技术
4.1 超参数优化
- 网格搜索:对所有可能的参数组合进行穷举搜索,找到最佳参数组合。
- 随机搜索:随机选择参数组合进行搜索,相对高效。
- 贝叶斯优化:利用贝叶斯推理逐步优化参数选择过程。
4.2 正则化
通过在损失函数中添加正则项,防止过拟合:
- L1正则化:加入参数的绝对值和(Lasso回归)。
- L2正则化:加入参数的平方和(Ridge回归)。
4.3 特征选择
选择对模型性能影响较大的特征,去除冗余或相关性高的特征。
五、 常见问题及解决方法
5.1 过拟合与欠拟合
- 过拟合:模型在训练集上表现良好,但在测试集上表现差。解决方法包括增加数据量、正则化、使用更简单的模型等。
- 欠拟合:模型在训练集上和测试集上都表现不佳。解决方法包括增加模型复杂度、添加更多特征等。
5.2 数据不平衡
当某一类样本数量远多于其他类时,模型可能偏向于预测多数类。解决方法包括重采样、调整分类阈值、使用加权损失函数等。
六、入门经典案例
1. 鸢尾花数据集分类(Iris Dataset Classification)
背景
鸢尾花数据集是机器学习领域中非常经典的数据集,由英国统计学家和生物学家Fisher在1936年提出。该数据集包含150个样本,每个样本有4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。目标是根据这些特征将鸢尾花分为三类:山鸢尾(Setosa)、变色鸢尾(Versicolor)和维吉尼亚鸢尾(Virginica)。
过程
- 数据预处理:加载数据并进行基本的清洗和探索性数据分析(EDA)。
- 特征选择:选择合适的特征来进行分类。
- 数据划分:将数据集分为训练集和测试集,一般采用80/20或70/30的比例。
- 模型选择:选择合适的分类算法,如K近邻(KNN)、支持向量机(SVM)、决策树(Decision Tree)等。
- 模型训练:在训练集上训练模型。
- 模型评估:在测试集上评估模型的性能,常用的评估指标包括准确率、混淆矩阵、F1分数等。
- 模型优化:根据评估结果进行参数调优或选择其他模型。
详解
# 示例代码(以KNN为例)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 模型训练
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# 模型预测
y_pred = knn.predict(X_test)
# 模型评估
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("Classification Report:\n", classification_report(y_test, y_pred))
2. 房价预测(Housing Price Prediction)
背景
房价预测是回归问题的经典案例之一,通常使用波士顿房价数据集。该数据集包含506个数据点,每个数据点有13个特征(如房间数量、房龄、犯罪率等),目标是预测房屋的中位数价格。
过程
- 数据预处理:加载数据,处理缺失值和异常值,进行EDA。
- 特征工程:选择重要特征,并进行特征缩放。
- 数据划分:将数据集分为训练集和测试集。
- 模型选择:选择回归模型,如线性回归(Linear Regression)、随机森林回归(Random Forest Regression)等。
- 模型训练:在训练集上训练模型。
- 模型评估:在测试集上评估模型性能,常用评估指标包括均方误差(MSE)、均方根误差(RMSE)等。
- 模型优化:根据评估结果进行参数调优或选择其他模型。
详解
# 示例代码(以线性回归为例)
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 加载数据
boston = load_boston()
X = boston.data
y = boston.target
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 模型训练
lr = LinearRegression()
lr.fit(X_train, y_train)
# 模型预测
y_pred = lr.predict(X_test)
# 模型评估
mse = mean_squared_error(y_test, y_pred)
rmse = mse ** 0.5
print("MSE:", mse)
print("RMSE:", rmse)
3. 手写数字识别(Digit Recognition)
背景
手写数字识别是计算机视觉中的经典问题,通常使用MNIST数据集。该数据集包含60000个训练样本和10000个测试样本,每个样本是28x28像素的灰度图像,代表手写的数字0-9。
过程
- 数据预处理:加载数据,并进行基本的图像处理。
- 特征工程:将图像数据展平或进行特征提取。
- 数据划分:将数据集分为训练集和测试集。
- 模型选择:选择分类模型,如卷积神经网络(CNN)、支持向量机(SVM)等。
- 模型训练:在训练集上训练模型。
- 模型评估:在测试集上评估模型性能,常用评估指标包括准确率、混淆矩阵等。
- 模型优化:根据评估结果进行参数调优或选择其他模型。
详解
# 示例代码(以简单的多层感知机为例)
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical
# 加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据预处理
X_train = X_train.reshape(-1, 28*28).astype('float32') / 255.0
X_test = X_test.reshape(-1, 28*28).astype('float32') / 255.0
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 构建模型
model = Sequential([
Flatten(input_shape=(28*28,)),
Dense(128, activation='relu'),
Dense(64, activation='relu'),
Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
# 评估模型
loss, accuracy = model.evaluate(X_test, y_test)
print("Loss:", loss)
print("Accuracy:", accuracy)
🌟感谢支持 听忆.-CSDN博客
🎈众口难调🎈从心就好 |