python机器学习算法_⼿把⼿教你使⽤Python实现机器学习算
这是⼀篇⼿把⼿教你使⽤ Python 实现机器学习算法,并在数值型数据和图像数据集上运⾏模型的⼊门教程,当你看完本⽂后,你应当可以开始你的机器学习之旅了!
本教程会采⽤下述两个库来实现机器学习算法:
scikit-learn
Keras
此外,你还将学习到:
评估你的问题
准备数据(原始数据、特征提取、特征⼯程等等)
检查各种机器学习算法
检验实验结果
深⼊了解性能最好的算法
在本⽂会⽤到的机器学习算法包括:
KNN
朴素贝叶斯
情感视频素材库无水印逻辑回归
SVM
决策树
随机森林
感知机
多层前向⽹络
CNNs
安装必备的 Python 机器学习库
开始本教程前,需要先确保安装了⼀下的 Python 库:
Numpy:⽤于 Python 的数值处理
PIL:⼀个简单的图像处理库
scikit-learn:包含多种机器学习算法(注意需要采⽤ 0.2+ 的版本,所以下⽅安装命令需要加上 --upgrade )
Kears 和 TensorFlow:⽤于深度学习。本教程可以仅采⽤ CPU 版本的 TensorFlow
OpenCV:本教程并不会采⽤到 OpenCV,但 imutils 库依赖它;
imutils :作者的图像处理/计算机视觉库
安装命令如下,推荐采⽤虚拟环境(⽐如利⽤ anaconda 创建⼀个新的环境):
$ pip install numpy$ pip install pillow$ pip install --upgrade scikit-learn$ pip install tensorflow # or tensorflow-
gpu$ pip install keras$ pip install opencv-contrib-python$ pip install --upgrade imutils
数据集
本教程会⽤到两个数据集来帮助更好的了解每个机器学习算法的性能。
第⼀个数据集是 Iris(鸢尾花) 数据集。这个数据集的地位,相当于你刚开始学习⼀门编程语⾔时,敲下的 “Hello,World!”
这个数据集是⼀个数值型的数据,如下图所⽰,其实就是⼀个表格数据,每⼀⾏代表⼀个样本,然后每⼀列就是不同的属性。这个数据集主要是收集了三种不同的鸢尾花的数据,分别为:
Iris Setosa
Iris Versicolor
Iris Virginica
对应图中最后⼀列 Class label,然后还有四种属性,分别是:
Sepal length--萼⽚长度
Sepal width--萼⽚宽度
Petal length--花瓣长度
Petal width--花瓣宽度
这个数据集可能是最简单的机器学习数据集之⼀了,通常是⽤于教导程序员和⼯程师的机器学习和模式识别基础的数据集。
对于该数据集,我们的⽬标就是根据给定的四个属性,训练⼀个机器学习模型来正确分类每个样本的类别。
需要注意的是,其中有⼀个类别和另外两个类别是线性可分的,但这两个类别之间却并⾮线性可分,所以我们需要采⽤⼀个⾮线性模型来对它们进⾏分类。当然了,在现实⽣活中,采⽤⾮线性模型的机器学习算法是⾮常常见的。
第⼆个数据集是⼀个三场景的图像数据集。这是帮助初学者学习如何处理图像数据,并且哪种算法在这两种数据集上性能最优。
下图是这个三场景数据集的部分图⽚例⼦,它包括森林、⾼速公路和海岸线三种场景,总共是 948 张图⽚,每个类别的具体图⽚数量如下:
Coast: 360
Forest: 328
infallible
Highway: 260
这个三场景数据集是采样于⼀个⼋场景数据集中,作者是 Oliva 和 Torralba 的 2001 年的⼀篇论⽂,Modeling the shape of the scene: a holistic representation of the spatial envelope
利⽤ Python 实现机器学习的步骤
⽆论什么时候实现机器学习算法,推荐采⽤如下流程来开始:
评估你的问题
准备数据(原始数据、特征提取、特征⼯程等等)
检查各种机器学习算法
检验实验结果
深⼊了解性能最好的算法
这个流程会随着你机器学习⽅⾯的经验的积累⽽改善和优化,但对于初学者,这是我建议⼊门机器学习时采⽤的流程。
所以,现在开始吧!第⼀步,就是评估我们的问题,问⼀下⾃⼰:
数据集是哪种类型?数值型,类别型还是图像?
模型的最终⽬标是什么?
如何定义和衡量“准确率”呢?
以⽬前⾃⾝的机器学习知识来看,哪些算法在处理这类问题上效果很好?
最后⼀个问题⾮常重要,随着你使⽤ Python 实现机器学习的次数的增加,你也会随之获得更多的经验。根据之前的经验,你可能知道有⼀种算法的性能还不错。
因此,接着就是准备数据,也就是数据预处理以及特征⼯程了。
⼀般来说,这⼀步,包括了从硬盘中载⼊数据,检查数据,然后决定是否需要做特征提取或者特征⼯程。
特征提取就是应⽤某种算法通过某种⽅式来量化数据的过程。⽐如,对于图像数据,我们可以采⽤计算直⽅图的⽅法来统计图像中像素强度的分布,通过这种⽅式,我们就得到描述图像颜⾊的特征。
⽽特征⼯程则是将原始输⼊数据转换成⼀个更好描述潜在问题的特征表⽰的过程。当然特征⼯程是⼀项更先进的技术,这⾥建议在对机器学习有了⼀定经验后再采⽤这种⽅法处理数据。
第三步,就是检查各种机器学习算法,也就是实现⼀系列机器学习算法,并应⽤在数据集上。
这⾥,你的⼯具箱应当包含以下⼏种不同类型的机器学习算法:
线性模型(⽐如,逻辑回归,线性 SVM)
⾮线性模型(⽐如 RBF SVM,梯度下降分类器)
gparted下载
树和基于集成的模型(⽐如 决策树和随机森林)
神经⽹络(⽐如 多层感知机,卷积神经⽹络)
应当选择⽐较鲁棒(稳定)的⼀系列机器学习模型来评估问题,因为我们的⽬标就是判断哪种算法在当前问题的性能很好,⽽哪些算法很糟
糕。
决定好要采⽤的模型后,接下来就是训练模型并在数据集上测试,观察每个模型在数据集上的性能结果。
在多次实验后,你可能就是有⼀种“第六感”,知道哪种算法更适⽤于哪种数据集。⽐如,你会发现:
对于有很多特征的数据集,随机森林算法的效果很不错;
python入门教程完整版百度网盘⽽逻辑回归算法可以很好处理⾼维度的稀疏数据;
对于图像数据,CNNs 的效果⾮常好。
⽽以上的经验获得,当然就需要你多动⼿,多进⾏实战来深⼊了解不同的机器学习算法了!
开始动⼿吧!
接下来就开始敲代码来实现机器学习算法,并在上述两个数据集上进⾏测试。本教程的代码⽂件⽬录如下,包含四份代码⽂件和⼀
个 3scenes⽂件夹,该⽂件夹就是三场景数据集,⽽ Iris 数据集直接采⽤ scikit-learn 库载⼊即可。
├── 3scenes│  ├── coast [360 entries]│  ├── forest [328 entries]│  └── highway [260 entries]├── classify_iris
⾸先是实现 classify_iris.py,这份代码是采⽤机器学习算法来对 Iris 数据集进⾏分类。
⾸先导⼊需要的库:
ighbors import KNeighborsClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.linear_model im
置参数ap = argparse.ArgumentParser()ap.add_argument("-m", "--
model", type=str, default="knn", help="type of python machine learning model to use")args = vars(ap.parse_args())# 定义⼀
个保存模型的字典,根据 key 来选择加载哪个模型
models = {    "knn": KNeighborsClassifier(n_neighbors=1),    "naive_bayes": GaussianNB(),    "logit": LogisticRegression(solver="lbfgs
可以看到在 sklearn 库中就集成了我们将要实现的⼏种机器学习算法的代码,包括:
KNN
朴素贝叶斯height constraint
逻辑回归
SVM
决策树
随机森林
感知机
我们直接调⽤ sklearn 中相应的函数来实现对应的算法即可,⽐如对于 knn算法,直接调⽤ ighbors 中
的 KNeighborsClassifier() 即可,只需要设置参数 n_neighbors ,即最近邻的个数。
这⾥直接⽤⼀个 models 的字典来保存不同模型的初始化,然后根据参数 --model 来调⽤对应的模型,⽐如命令输⼊ python
classify_irs.py --model knn 就是调⽤ knn 算法模型。
接着就是载⼊数据部分:
print("[INFO] ")dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,    dataset.target, random_state=3, test_size=0.25)
这⾥直接调⽤ sklearn.datasets 中的 load_iris() 载⼊数据,然后采⽤ train_test_split 来划分训练集和数据集,这⾥是 75% 数据作为训
练集,25% 作为测试集。
最后就是训练模型和预测部分:
pycharm最新激活码# 训练模型print("[INFO] using '{}' model".format(args["model"]))model = models[args["model"]]model.fit(trainX, trainY)# 预测
并输出⼀份分类结果报告print("
[INFO] evaluating")predictions = model.predict(testX)print(classification_report(testY, predictions, target_names=dataset.target_nam
完整版代码代码如下:
ighbors import KNeighborsClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.linear_model im
置参数ap = argparse.ArgumentParser()ap.add_argument("-m", "--
model", type=str, default="knn", help="type of python machine learning model to use")args = vars(ap.parse_args())# 定义⼀
个保存模型的字典,根据 key 来选择加载哪个模型
models = {    "knn": KNeighborsClassifier(n_neighbors=1),    "naive_bayes": GaussianNB(),    "logit": LogisticRegression(solver="lbfgs ⼊ Iris 数据集,然后进⾏训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集print("
[INFO] ")dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25)# 训练模型print(" [INFO] using '{}' model".format(args["model"]))model = models[args["model"]]model.fit(trainX, trainY)# 预测并输出⼀份分类结
果报告print("
[INFO] evaluating")predictions = model.predict(testX)print(classification_report(testY, predictions, target_names=dataset.target_nam
接着就是采⽤三场景图像数据集的分类预测代码 classify_images.py ,跟 classify_iris.py 的代码其实是⽐较相似的,⾸先导⼊库部分,
增加以下⼏⾏代码:
from sklearn.preprocessing import LabelEncoderfrom PIL import Imagefrom imutils import pathsimport numpy as npimport os
其中 LabelEncoder 是为了将标签从字符串编码为整型,然后其余⼏项都是处理图像相关。
对于图像数据,如果直接采⽤原始像素信息输⼊模型中,⼤部分的机器学习算法效果都很不理想,所以这⾥采⽤特征提取⽅法,主要是统计
图像颜⾊通道的均值和标准差信息,总共是 RGB 3个通道,每个通道各计算均值和标准差,然后结合在⼀起,得到⼀个六维的特征,函数
如下所⽰:
def extract_color_stats(image):    '''    将图⽚分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返
回    :param image:    :return:    '''    (R, G, B) = image.split()    features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), n
然后同样会定义⼀个 models 字典,代码⼀样,这⾥就不贴出来了,然后图像载⼊部分的代码如下:
# 加载数据并提取特征print("
[INFO] extracting ")imagePaths = paths.list_images(args['dataset'])data = []labels = []# 循环遍历所有的图⽚数
据for imagePath in imagePaths:    # 加载图⽚,然后计算图⽚的颜⾊通道统计信
息    image = Image.open(imagePath)    features = extract_color_stats(image)    data.append(features)    # 保存图⽚的标签信
息    label = imagePath.split(os.path.sep)[-2]    labels.append(label)# 对标签进⾏编码,从字符串变为整数类型
le = LabelEncoder()labels = le.fit_transform(labels)# 进⾏训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.25)
上述代码就完成从硬盘中加载图⽚的路径信息,然后依次遍历,读取图⽚,提取特征,提取标签信息,保存特征和标签信息,接着编码标
签,然后就是划分训练集和测试集。
接着是相同的训练模型和预测的代码,同样没有任何改变,这⾥就不列举出来了。
完整版如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。