什么是“机器学习”
机器学习的定义可以引用Tom Mitchell在1998年的论文中给出的定义:“计算机程序通过从经验E中学习,针对任务T的性能P随着经验E的增长而提高。”
其中经验E被定义为输入数据集,任务T是指学习到的结果产生的行为或输出,并且性能P度量了任务T的成功程度。
这个定义描述了机器学习解决实际问题的方法,即基于大量的数据和特定的模型,不断地进行求解优化,以获得更好的性能并提高算法的智能水平。
映射到相关输出上进行训练,使算法能够确定输入和输出之间的关系。
一个通俗易懂的示例是,假设我们要训练一个机器学习模型来识别猫和狗的图片,那么我们需要使用一些已经被标记过类别的图片作为训练数据集:其中猫的图片标记为“猫”,狗的图片标记为“狗”,这个数据集便是含有相关标签的监督学习的面向对象数据。
常见的监督学习算法包括:线性回归、决策树、感知器、支持向量机和神经网络等。
非监督学习是一种从未标记的数据集中发现启示因素来分类和模式提取的机器学习方法。其要点在于算法没有指定预测变量或结果,而是试图发现数据自身的结构和有趣的特征。
一个示例是,假设我们有一个没有进行标签分类的音乐库,我们可以使用非监督学习来查找音频质量、相关性等相似性模式。然后,利用这些模式对音乐库中的歌曲进行分类和聚类,得到具有意义的组合。
常见的非监督学习算法包括:k-均值聚类、主成分分析(PCA)、高斯混合模型和自编码器等。
强化学习是一种机器学习方法,是通过自适应过程选择行动来最大化累积奖励的系统算法。强化学习包含环境、代理和行动三个基本元素,并通过探索与开发的策略不断地提高其在面临不确定性情况下适应实际环境的能力。
一个简单的强化学习示例是,训练一只机器人从出发点走到目的地。在这个过程中,机器人需要考虑哪条路线是最短或者最便捷的,同时他还需要避免障碍物和其他问题,而这些问题都会影响到他达成任务的速度和准确性。因此,通过尝试不同策略,比较效果,最终确定一个最优的路径。
常见的强化学习算法包括:Q-learning、状态-动作对(SARSA)、策略梯度和深度强化学习等。
K最近邻方法是一种分类和回归算法,其中预测样本的类别是由其k个最相似的邻居中多数类决定的。邻居之间的相似度通常是基于距离度量来计算的。这个算法简单易懂,并且对于新数据具有很强的鲁棒性。
比如我们想要根据一堆人的身高和体重来预测他们的性别,我们可以使用KNN方法。下面是Python代码示例:
from sklearn.neighbors import KNeighborsClassifier# 创建模型对象knn = KNeighborsClassifier(n_neighbors=3)# 构建数据集X_train = [[175, 70], [180, 90], [160, 50], [165, 65]]y_train = ['男', '男', '女', '女']# 拟合数据knn.fit(X_train, y_train)# 预测新数据X_new = [[170, 75]]y_pred = knn.predict(X_new)print(y_pred)
决策树是一种分类和回归算法,在该算法中,通过构建决策节点和叶节点来对输入数据进行分组。每个决策节点代表一个特征,叶子节点包含一个类别标签或者是一个连续数值。
下面是一个以“是否应该发放信用卡”为问题的决策树示例:
上述图例展示了一个简单的决策树。在此模型中,我们要决定是否应该向某个人发放信用卡。可以看到,我们首先评估该人的年龄是否小于25岁。如果是,则他将被拒绝,否则我们会进一步考虑他的工作是否稳定。如果这个人的工作稳定,则他将被批准;否则我们将再次查询他的居住地是否在一个高犯罪率的街区。如果确实是这样,我们将拒绝他发放信用卡,否则我们将最终批准他的申请。
下面是一个Python代码示例,展示如何使用sklearn.tree库实现决策树分类器:
from sklearn.tree import DecisionTreeClassifier# 创建模型对象tree = DecisionTreeClassifier(max_depth=2)# 构建数据集X_train = [[22, 5000], [25, 10000], [30, 30000], [35, 40000]]y_train = ['N', 'N', 'Y', 'Y']# 拟合数据tree.fit(X_train, y_train)# 预测新数据X_new = [[23, 6000]]y_pred = tree.predict(X_new)print(y_pred)
支持向量机(SVM)是一种非常有效的分类算法,它可以处理线性和非线性问题。SVM在特征空间中寻找一个合适的超平面,将不同类别的数据点分开。通常使用核函数将数据映射到高维空间,以便更好地解决非线性问题。
下面是一个SVM的示例,假设我们要判断猫和狗,根据他们身高和体重来判断:
from sklearn.svm import SVC# 创建模型对象svm = SVC(kernel='linear')# 构建数据集X_train = [[35, 10], [45, 15], [22, 5], [38, 18]]y_train = ['cat', 'dog', 'cat', 'dog']# 拟合数据svm.fit(X_train, y_train)# 预测新数据X_new = [[30, 12]]y_pred = svm.predict(X_new)print(y_pred)
朴素贝叶斯分类器是一种基于概率的分类算法,这意味着它评估每个类别出现的概率,并根据输入特征的条件概率分布进行分类。它基于贝叶斯定理和“朴素”的假设:所有的特征都是独立的且对分类有相同的影响。
下面是一个Python代码示例,展示如何使用sklearn.naive_bayes库实现高斯朴素贝叶斯分类器:
from sklearn.naive_bayes import GaussianNB# 创建模型对象gnb = GaussianNB()# 构建数据集X_train = [[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],[1, 'S'], [2, 'S'], [2, 'M'], [2, 'M'],[2, 'L'], [2, 'L'], [3, 'L'], [3, 'M'], [3, 'M'],[3, 'L'], [3, 'L']]y_train = ['N', 'N', 'Y', 'Y','N', 'N', 'N', 'Y','Y', 'Y', 'Y', 'Y','Y', 'Y', 'N']# 拟合数据gnb.fit(X_train, y_train)# 预测新数据X_new = [[2, 'S']]y_pred = gnb.predict(X_new)print(y_pred)
神经网络是一种仿生学习算法,它模拟人脑神经元之间相互作用的过程,通过多层节点构建一个复杂的非线性函数来实现对数据的学习和分类。有两个主要的部分:输入层和输出层,其中输入层接收数据特征,输出层返回分类结果,并通过中间隐藏层连接这两个部分。
示例代码:
import numpy as np# 定义sigmoid函数def sigmoid(x):return 1.0 / (1 + np.exp(-x))# 定义神经网络类class NeuralNetwork:def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate):self.inodes = input_nodesself.hnodes = hidden_nodesself.onodes = output_nodes# 初始化权重矩阵self.weights_input_hidden = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes))self.weights_hidden_output = np.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes))# 学习率self.lr = learning_rate# 激活函数self.activation_function = lambda x: sigmoid(x)def train(self, inputs_list, targets_list):# 输入转化为二维数组inputs = np.array(inputs_list, ndmin=2).Ttargets = np.array(targets_list, ndmin=2).T# 前向传播hidden_inputs = np.dot(self.weights_input_hidden, inputs)hidden_outputs = self.activation_function(hidden_inputs)final_inputs = np.dot(self.weights_hidden_output, hidden_outputs)final_outputs = self.activation_function(final_inputs)# 后向传播output_errors = targets - final_outputshidden_errors = np.dot(self.weights_hidden_output.T, output_errors)self.weights_hidden_output += self.lr * np.dot((output_errors*final_outputs*(1.0-final_outputs)), np.transpose(hidden_outputs))self.weights_input_hidden += self.lr * np.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)), np.transpose(inputs))def query(self, inputs_list):# 输入转化为二维数组inputs = np.array(inputs_list, ndmin=2).T# 前向传播hidden_inputs = np.dot(self.weights_input_hidden, inputs)hidden_outputs = self.activation_function(hidden_inputs)final_inputs = np.dot(self.weights_hidden_output, hidden_outputs)final_outputs = self.activation_function(final_inputs)return final_outputs
集成方法是通过组合多个单一的学习器来达到更好的性能,以降低单一算法的过拟合风险、提高分类准确率为目的。主要包括两种方法:Bagging和Boosting。
示例代码:
from sklearn.ensemble import BaggingClassifier, AdaBoostClassifierfrom sklearn.tree import DecisionTreeClassifier# 初始化决策树dt = DecisionTreeClassifier(max_depth=20)# Bagging方法bg = BaggingClassifier(dt, n_estimators=5, max_samples=0.5, max_features=1.0, random_state=1)# Boosting方法ab = AdaBoostClassifier(dt, n_estimators=5, learning_rate=1.0, random_state=1)# 训练模型bg.fit(X_train, y_train)ab.fit(X_train, y_train)# 预测结果bg_y_pred = bg.predict(X_test)ab_y_pred = ab.predict(X_test)
集成方法在很多领域都有广泛的应用,比如信用评估、医学诊断、图像识别、推荐系统等。
数据预处理是机器学习模型的重要一环,指对数据进行清洗、转化和归一化等处理。这些处理通常包括去除噪音、处理缺失值、标准化数据等。数据预处理可以帮助提高训练模型的成功率,也有助于提高模型的精度。
在进行数据分析时,原始数据中可能会存在噪声和异常值,这些异常值可能会导致数据分析结果出现问题。因此,在进行机器学习或其他数据挖掘任务之前,需要进行数据清洗。
在数据清洗过程中,我们需要识别和处理无效或不完整的数据,例如缺失数据点、含噪音的数据点和离群值等。举例来说,如果我们要进行天气预测,但是某一天的温度数值为-999,这显然是错误的数据,需要将其删除或填充。
在机器学习中,不同的特征会影响到模型的表现。一个好的特征集合可以提高模型的预测准确性。因此,选择最相关的特征子集对于建立高效的机器学习模型是至关重要的。
特征选择可以分为过滤式方法、包装式方法和嵌入式方法。其中,过滤式方法主要是基于统计学方法来评估各个特征之间的相关性,并根据相关性和其他指标进行排序;包装式方法将特征选择看作是一个搜索问题,并通过迭代选择最佳子集;而嵌入式方法是将特征选择融合到模型训练过程中的一种技术。
例如,在某一具体问题中,我们可能有多个特征变量,如血糖、心率以及年龄等。需要根据这些变量与问题的关系,选择出最重要的几个变量,而排除一些与问题无关或影响较小的变量。这样可以提高模型的准确度,同时简化模型复杂度。
在机器学习预处理阶段,特征变换是非常重要的一环。目的是将原始数据转化为可以将其用于构建模型的格式。通常,它包括特征缩放、属性变换、降维等不同的方法。
例如,特征缩放旨在将特征值缩放到一定的范围内。这样做可以避免特征权重之间的偏差,有助于模型更好地学习数据。具体来说,在某些机器学习算法中,如K近邻算法和支持向量机等,数据标准化(也就是将数据缩放到一个具有零均值和单位方差的范围内)是必不可少的一步。
特征缩放是一种特征变换方法,用于将特征值压缩为一个指定范围内的值。这有助于算法在处理不同单位之间差异较大的特征时获得更多的信息。常见的特征缩放方法包括标准化、归一化等。
例如,在考虑房价预测问题时,我们经常需要对不同城市、不同年份以及不同房子的价格进行比较。样本中各特征值在数值上存在着不同的量纲差异,即量纲不一致,而直接使用原始数据不仅可能导致某些特征的权重被放大,还会影响模型的训练。因此我们需要使用特征缩放方法来处理数据,使数据转化为可以被机器学习模型所接受的格式。
在机器学习中,建立预测性模型(如分类模型和回归模型)通常需要训练数据集。为了获得高质量的模型,在训练之前和之后需要进行模型评估和选择。模型评估旨在衡量模型的优劣程度,而模型选择则是从多个候选模型中选择一个最佳模型。
在训练模型时,我们希望模型能够较精确地拟合训练数据,并对新的数据进行预测。但是,当模型过度拟合训练数据时,它将会受到许多噪声特征的影响从而出现一些偏差,这就是过拟合;而相反的,当模型无法捕捉到数据的主要区别时,就会出现欠拟合的情况。
过拟合的解决方法一般是:增加数据量,降低模型复杂度或增加正则化项;欠拟合的解决方法一般是:增加特征数量,增加模型复杂度或选择更好的算法。
在进行模型评估时,我们希望能够基于已有数据来评估训练的模型的性能。为了保证评估结果的可靠性,我们一般需要通过交叉验证技术来避免偏差和方差过大问题。
交叉验证是一种统计学方法,其目的是通过将数据集拆分为互斥训练子集和测试子集,并重复执行多次实验,来估计模型的性能并减少结果受随机数偏差的影响。常见的交叉验证方法包括K折交叉验证、留一交叉验证等。
在进行模型评估时,需要用到一些评价指标来衡量模型的表现。下面介绍一些常用的评价指标:
利用Python开源库scikit-learn,我们可以很容易地实现一个简单的机器学习模型并进行模型训练、测试和评估。
# 导入必要的库和模块from sklearn.datasets import load_irisfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import train_test_split# 使用sklearn内置鸢尾花数据集iris = load_iris()# 数据分割,切分出25%作为测试集X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.25, random_state=42)# 构建KNN分类器,并利用训练集进行模型拟合knn = KNeighborsClassifier(n_neighbors=3)knn.fit(X_train, y_train)# 在测试集上进行模型预测y_pred = knn.predict(X_test)# 输出模型的准确率print(fAccuracy: {knn.score(X_test, y_test)})
输出结果:
复制代码Accuracy: 1.0
在本章节中,我们介绍了机器学习的三种主要类型、常见算法模型及数据预处理的重要性。我们还提供了一个简单的Python实现示例,帮助您更好地理解机器学习算法的实际应用。
各位还想看人工智能的那些内容,可以关注作者并留言!
本文由梁桂钊于2022-04-27发表在梁桂钊的博客,如有疑问,请联系我们。
本文链接:https://720ui.com/2999.html