研一机器学习小白开始写博客记录学习了!请各位CSDN大佬多多指教[抱拳]

读书笔记1
《Python Machine Learning Blueprints》 Alexander T.Combs 著
《Python机器学习实践指南》黄申 译

本文首先介绍机器学习基本流程,然后使用Jupyter Notebook作为编译器,通过实际项目了解机器学习流程及常用Python机器学习库,比如numpy(用于科学计算)、pandas(基于numpy,用于大型数据分析)、matplotlib(用于数据可视化)、seaborn(用于图形风格整洁化)、statsmodels(用于探索数据、评估模型)、scikit-learn(覆盖分类、回归、聚类、降维、模型选择和预处理等领域)。
可提前下载好需要用到的库, Win+R在命令行分别运行
pip install requests
pip install numpy
pip install pandas
pip install matplotlib
pip install seaborn
pip install statsmodels
conda install scikit-learn
安装包可参考–Python及其常用模块库下载及安装

机器学习/数据科学的工作流程一般有六个步骤:获取,检查和探索,清理和准备,建模,评估和最后的部署。

获取

机器学习应用中的数据,可以来自不同的的数据源,可能是通过电子邮件发送的CSV文件,也可能是从服务器中拉取出来的日志,或者它可能需要构建自己的Web爬虫。数据也可能存在不同的格式,大部分情况下数据是基于文本格式的,但基于图像、甚至视频文件的机器学习应用也在不断发展。
简单例子:

import requests
r = requests.get(r"https://api.github.com/users/acombs/starred")
r.json()

检查和探索

获得数据之后,下一步就是合理地检查数据。比如说:如果数据具有唯一的标识,那就检查数据是否真的只有一个;如果数据是基于价格的,检查是否总为正数;检查数据是否缺失或者不完整。无论数据是何种类型,检查最极端的情况通常是检查异常的最好办法。一个良好的实践是在数据上运行一些简单的统计测试,并将数据可视化。

清理和准备

当所有数据准备就绪,下一步就是将它转化为适合于模型使用的格式。这个阶段包括若干过程,如过滤、聚集、输入和转化。所需操作类型将很大程度上取决于数据的类型,以及所使用的库和算法的类型。

建模

数据准备完成以后,下一阶段就是建模了。在这个阶段我们将选择适当的算法,并在数据上训练乘䘝模型。基本步骤包括将数据分割为训练、测试和验证的集合。

评估

模型构建完成并开始进行预测,下一步就是了解模型做的有多好。有很多方式来衡量模型的表现,它在很大程度上依赖于所用数据和模型的类型,不过就整体而言评估阶段试图回答:模型的预测和实际值到底有多接近。

部署

一旦模型表现令人满意。那么下一个步骤就是部署了。根据具体的使用情况,这个阶段有不同的形式,但常见的场景包括:将其作为一个大型应用程序中的某个功能特性,一个定制的Web应用程序,甚至一个简单的cron作业。

下面开始项目实践以了解机器学习具体步骤。

数据准备及检查

  • 从网站 http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data 下载一个经典的机器学习数据集:iris.data,并将其写入iris目录
import os
import pandas as pd
import requestsPATH = r' C:\Users\Lenovo\Desktop\data\iris'         # 先在桌面新建一个名为data的文件夹,copy路径粘贴至此
r = requests.get('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')with open(PATH + 'iris.data', 'w') as f:f.write(r.text)os.chdir(PATH)
df = pd.read_csv(PATH + 'iris.data', names=['sepal length', 'sepal width', 'petal length', 'petal width', 'class'])
df.head()


先学基本操作
在pandas中,操作的基本单位是表格形式的数据列和行,数据列称为Series,表格称为DateFrame. 以下通过列名,从数据框中选择一列

df = pd.read_csv(PATH + 'iris.data', names=['sepal length', 'sepal width', 'petal length', 'petal width', 'class'])
df['sepal length']


使用.iloc[row,column]标注,执行数据切片,选择前两列和前四行

df.iloc[:3,:2]


使用.loc标注和Python列表切片的语法,可以选择数据框中的一小片; 使用列表迭代器并只选择描述width的列.

df.loc[:3, [x for x in df.columns if 'width' in x]]


另一种选择数据的方法:根据某些特定的条件选择数据的一个子集。下面代码先列出所有可用唯一类,然后选择其中之一。

df['class'].unique()


选择数据框中只包含Iris-virginica类的数据

df[df['class']=="Iris-virginica"]


计算数据框大小(总数)

df.count()


计算Iris-virginica类总数

df[df['class']=='Iris-virginica'].count()


将Iris-virginica数据保存为一个新的数据并重置索引

virginica = df[df['class']=='Iris-virginica'].reset_index(drop=True)
virginica


我们通过在某个列上放置条件来选择数据,现在来添加更多的条件。下面我们将回到最初始的数据框,并使用两个条件来选择数据。

df[(df['class']=='Iris-virginica')&(df['petal width']>2.2)]


下面使用pandas,从虹膜数据集中获取一些快速的描述性统计数据(类别信息被自动屏蔽了,因为它在这里是不相关的)

df.describe()
# 如果想要更详细的信息,还可以使用下列代码传入百分比:
# df.describe(percentiles=[.20, .40, .80, .90, .95])


下面检查特征之间是否有相关性,通过在数据鲁昂上调用.corr()来完成

df.corr()

数据可视化

创建一个宽6英尺、高4英尺的插图,通过调用.hist()并传入数据,依照iris数据框绘制了花瓣宽度的直方图,将颜色设为black;设置y、x轴标签;最后一行设置直方图标题;

import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')
%matplotlib inlinefig, ax = plt.subplots(figsize=(6, 4))
ax.hist(df['petal width'], color='black')
ax.set_ylabel('Count', fontsize=12)
ax.set_xlabel('Width', fontsize=12)
plt.title('Iris Petal Width', fontsize=14, y=1.01)


下面为为iris数据集的每一列生成直方图ax.hist()

fig, ax = plt.subplots(2, 2, figsize=(6, 4))ax[0][0].hist(df['petal width'],color='black')
ax[0][0].set_ylabel('Count', fontsize=12)
ax[0][0].set_xlabel('width', fontsize=12)
ax[0][0].set_title('Iris Petal Width', fontsize=14, y=1.01)ax[0][1].hist(df['petal length'],color='black')
ax[0][1].set_ylabel('Count', fontsize=12)
ax[0][1].set_xlabel('Length', fontsize=12)
ax[0][1].set_title('Iris Petal Length', fontsize=14, y=1.01)ax[1][0].hist(df['sepal width'],color='black')
ax[1][0].set_ylabel('Count', fontsize=12)
ax[1][0].set_xlabel('width', fontsize=12)
ax[1][0].set_title('Iris Sepal Width', fontsize=14, y=1.01)ax[1][1].hist(df['sepal length'],color='black')
ax[1][1].set_ylabel('Count', fontsize=12)
ax[1][1].set_xlabel('Length', fontsize=12)
ax[1][1].set_title('Iris Sepal Length', fontsize=14, y=1.01)plt.tight_layout()   # 自动调整子插图。以免过于拥挤


使用scatter绘制散点图

fig, ax = plt.subplots(figsize=(6, 6))
ax.scatter(df['petal width'], df['petal length'], color='black')
ax.set_xlabel('Petal Width')
ax.set_ylabel('Petal Length')
ax.set_title('Petal Scatterplot')

使用ax.plot()绘制线图

fig, ax = plt.subplots(figsize=(6, 6))
ax.plot(df['petal length'], color='blue')
ax.set_xlabel('Specimen Number')
ax.set_ylabel('Petal Length')
ax.set_title('Petal Length Plot')


使用ax.bar()绘制条形图,以下将三类鸢尾花中每个特征的平均值绘制一个条形图

fig, ax = plt.subplots(figsize=(6, 6))
bar_width = .8
labels = [x for x in df.columns if 'length' in x or 'width' in x]
ver_y = [df[df['class']=='Iris-versicolor'][x].mean() for x in labels]
vir_y = [df[df['class']=='Iris-virginica'][x].mean() for x in labels]
set_y = [df[df['class']=='Iris-setosa'][x].mean() for x in labels]
x = np.arange(len(labels))
ax.bar(x, vir_y, bar_width, bottom=set_y, color='darkgrey')
ax.bar(x,set_y, bar_width, bottom=ver_y, color='white')
ax.bar(x, ver_y, bar_width, color='black')
ax.set_xticks(x + (bar_width/2))      # 调整标签之间的间隔
ax.set_xticklabels(labels, rotation=-70, fontsize=12)      # 设置想要显示的列名
ax.set_title('Mean Feature Measurement By Class', y=1.01)
ax.legend(['Virginica', 'Setosa', 'Versicolor'])  # 添加图例


接下来学习seaborn并使用它将图形变得更美观、更整洁
仅通过两行代码绘制数据所有特性

import seaborn as sns
sns.pairplot(df, hue='class')


使用所学matplotlib来修改seaborn;使用violinplot生成小提琴图

fig, ax = plt.subplots(2, 2, figsize=(7, 7))
sns.set(style='white', palette='muted')
sns.violinplot(x=df['class'], y=df['sepal length'], ax=ax[0,0])
sns.violinplot(x=df['class'], y=df['sepal width'], ax=ax[0,1])
sns.violinplot(x=df['class'], y=df['petal length'], ax=ax[1,0])
sns.violinplot(x=df['class'], y=df['petal width'], ax=ax[1,1])
fig.suptitle('Violin Plots', fontsize=16, y=1.03)     # 在所有子图上添加总标题,而不是在每个单独的子图上各自添加标题
for i in ax.flat:      # 遍历每个子图的轴,并使用.step()设置特定的值取代xticklabels的轮换()plt.setp(i.get_xticklabels(), rotation=-90)
fig.tight_layout()


Map方法适用于序列,在我们的例子中将用它来转变数据框的某个列;以下使用map方法将一个python字典作为其参数

 df['class'] = df['class'].map({"Iris-setosa": 'SET', 'Iris-virginica':'VIR', 'Iris-versicolor':'VER'})
df


apple方法使我们既能在数据框上工作,也可以在序列上工作;
以下创建一个新的列,它包含一个基于petal width列的二进制值,之前花瓣宽度均值为1.3,那么现在如果花瓣宽度等于或者宽于中指将其编码为1,否则编码为0

df['wide petal'] = df['petal width'].apply(lambda v:1 if v >=1.3 else 0)
df


以下在数据框上使用aplly,而不知在一个单独的列上使用。

df['petal area'] = df.apply(lambda r:r['petal length']*r['petal width'], axis=1)  # 在数据框新增一列面积属性
df


groupby操作:基于某些你所选择的类别对数据进行分组

df.groupby('class').mean()   # 按照类别对数据进行划分并显示每个特征的均值
# df.groupby('class').describe()    # 按照类别对数据进行划分并得到每个类别完全的描述性统计信息

建模和评估

Statsmodels是用于探索数据、估计模型,并运行统计检验的python包; 以下,构建一个简单的线性回归模型; 为setosa类中花萼长度和花萼宽度之间的关系进行建模。
首先我们通过散点图来目测两者的关系

 fig, ax = plt.subplots(figsize=(7, 7))
ax.scatter(df['sepal width'][:50], df['sepal length'][:50])
ax.set_ylabel('Sepal Length')
ax.set_xlabel('Sepal Width')
ax.set_title('Setosa Sepal Width vs. Sepal Length', fontsize=14, y=1.02)


从上图可以看出,它们之间似乎有一个正向的线性关系,接下来用statmodels在这个数据集上运行一个线性回归模型,来预估这种关系的强度

import statsmodels.api as smy = df['sepal length'][:50]
x = df['sepal width'][:50]results = sm.OLS(y, x).fit()
print(results.summary())

接下来使用结果对象来绘制回归线

fig, ax = plt.subplots(figsize=(7,7))
ax.plot(x, results.fittedvalues, label='regression line')
ax.scatter(x, y, label='data point', color='r')
ax.set_ylabel('Sepal Length')
ax.set_xlabel('Sepal Width')
ax.set_title('Setosa Sepal Width vs. Sepal Length', fontsize=14, y=1.02)
ax.legend(loc=2)


scikit-learn覆盖的一些领域包括:分类、回归、聚类、降维、模型选择和预处理; 例子:首先,使用iris数据建立一个分类器,然后学习如何利用scikit-learn的工具来评估得到的模型。

from sklearn.ensemble import RandomForestClassifier        # 导入随机森林分类器
from sklearn.model_selection import train_test_split    # 导入将数据分成训练组和测试组的模块,train_test_split会打乱数据的先后顺序clf = RandomForestClassifier(max_depth=5, n_estimators=10)    # 实例化随机森林分类器
# 这里使用10个决策树的森林,每棵树最多允许五层的判定深度(避免过拟合overfitting)# 创建x矩阵和y向量
# 初始的iris数据框包含四个特征:花瓣的宽度和长度,以及花萼的宽度和长度,这些特征被选中成为独立特征矩阵
# 最后一列iris的类别成为因变量y向量
x = df.iloc[:, :4]
y = df.iloc[:, 4]x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = .3)
# test_size被设置为0.3说明,30%的数据集将被分配给x_test和y_test,其余的数据将被分配到训练的部分x_train和y_train# clf.fit(x_train, y_train)    #jupyter中可输出模型类型y_pred = clf.predict(x_test)    # 模型训练完毕,通过测试数据来调用分类器的预测方法,预测的返回结果是预估标签的列表rf = pd.DataFrame(list(zip(y_pred, y_test)), columns=['predicted', 'actual'])   # 创建对应实际标签与预估标签的数据框
rf['correct'] = rf.apply(lambda r:1 if r['predicted'] == r['actual'] else 0, axis=1)     # 最终,加和正确的预测次数,并将其除以样例总数,从而看出预测的准确率
rf


看看哪些特征提供了最佳的辨别能力,或者说预测能力

f_importances = clf.feature_importances_
f_names = df.columns[:4]
f_std = np.std([tree.feature_importances_ for tree in clf.estimators_], axis=0)zz = zip(f_importances, f_names, f_std)
zzs = sorted(zz, key=lambda x: x[0], reverse=True)
imps = [x[0] for x in zzs]
labels = [x[1] for x in zzs]
errs = [x[2]for x in zzs]
plt.bar(range(len(f_importances)), imps, color='r', yerr=errs, align='center')
plt.xticks(range(len(f_importances)), labels)


另一个使用scikit-learn的例子,切换分类器并使用支持向量机(SVM)

from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import numpy as npclf = OneVsRestClassifier(SVC(kernel='linear'))x = df.iloc[:,:4]
y = np.array(df.iloc[:,4]).astype(str)x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.3)
# clf.fit(x_train,y_train)
y_pred = clf.predict(x_test)
rf = pd.DataFrame(list(zip(y_pred, y_test)), columns=['predicted', 'actual'])
rf['correct'] = rf.apply(lambda r:1 if r['predicted'] == r['actual'] else 0,axis=1)
rf


模型的准确率已经很高!机器学习模型构建好并且评估完成以后最后一步就是部署,将一个机器学习模型放入生产环境时,有许多可用选项。它基本上取决于应用程序的性质。

本文到此结束,供自己参考复习也供大家学习,如有错误之处敬请留言。

一个小项目了解机器学习基本流程(附源码)相关推荐

  1. 从零教你实现一个小说和漫画在线阅读网站[附源码]

    今天给大家推荐的这个开源项目是一个基于 SpringBoot 实现的小说和漫画在线阅读网站. 这个开源项目叫:fiction_house. 这个开源项目是一个多平台(web.安卓 app.微信小程序) ...

  2. C++小游戏笔记——射击小行星(附源码)

    C++小游戏笔记--射击小行星(附源码) 游戏展示图 一.飞船 1.飞船的绘制 2.飞船的角度 二.小行星 1.小行星的绘制 2."凹凸不平"效果的形成 3.小行星的分裂 三.子弹 ...

  3. 【博主推荐】HTML制作一个美观的个人简介网页(附源码)

    文章目录 HTML制作一个美观的个人简介网页 模块1(个人信息)示例图 模块2(基本资料)示例图 模块3(项目经验)示例图 模块4(专业技能)示例图 模块5(工作经历)示例图 模块6(自我评价)示例图 ...

  4. Java毕设项目在线答题系统计算机(附源码+系统+数据库+LW)

    Java毕设项目在线答题系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  5. Java毕设项目便利店库存管理计算机(附源码+系统+数据库+LW)

    Java毕设项目便利店库存管理计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecl ...

  6. Java毕设项目信贷管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目信贷管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  7. Java毕设项目电费管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目电费管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ecli ...

  8. 微信小程序支付功能-服务器端实现(附源码)

    实现了小程序最新的V3版本支付功能, 包括:支付.支付通知.退款.退款通知. 服务器端使用java开发,springboot框架 源码链接在评论中 微信小程序支付功能-服务器端实现(附源码)_哔哩哔哩 ...

  9. c语言跳一跳辅助源码,.NET 开发一个微信跳一跳辅助程序(附源码)

    原标题:.NET 开发一个微信跳一跳辅助程序(附源码) 来源:中国.NET研究协会 cnblogs.com/dotnet-org-cn/p/8149693.html 前言 微信更新了,出现了一个小游戏 ...

最新文章

  1. Multiple markers at this line @Override的解决方法
  2. 虚拟Web主机(基于域名配置,基于ip地址,基于端口)
  3. lombok null字段不显示 继承_Lombok 要知道的 8 个点
  4. php时间函数单字母,ThinkPhp单字母函数
  5. mysql中datediff跨年的用法_Mysql 函数使用记录(一)——DATEDIFF、CONCAT
  6. 2017北京国庆刷题Day5 morning
  7. 聚类算法评价指标学习笔记
  8. SQL——正则表达式
  9. 【交换安全】DAI - Dynamic ARP Inspection 详解/arp欺骗/gratuitous arp
  10. 01 超级搜索术——信息搜索:全面、快速查找全网你想要的任何信息、情报
  11. 南宁刚经历1960年来5月最凉一周 降雨停歇气温将回升
  12. 服务器性能检测器,Linux服务器性能检测工具之 collectl
  13. 【通信工程】大三下课程设计-5G核心网功能设计与部署
  14. 【分享】ArcGIS实现分子分母等标注实用技巧
  15. 猿来你也在这里,北京上海无聊猿线下见面会成功举办
  16. 数值计算——最小二乘拟合二元一次多项式
  17. 物联网大咖华山论剑,MVP学院打造高端成长营
  18. 斯坦福大学开放课程:编程方法.02/第二课练习:karel 跳墙
  19. 计算机网络如何选择路由器,路由器上网方式如何选择?
  20. 用智能指针实行所有权

热门文章

  1. netron画yolov4网络结构图
  2. django中classMeta所有属性
  3. 什么是TE,MT,ME
  4. 杭州西湖申遗成功后首次举办烟花大会-杭州-西湖-烟花大会
  5. ( 转载)改变人类历史的17大数学方程
  6. visual错误:R6025 pure virtual funcion call
  7. js匹配正则匹配手机号/固话/带括号区号固话
  8. 太强了~Python 开发桌面小工具,让代码替我们干重复的工作
  9. 使用IQmath定点运算调试TI官方的软件锁相环
  10. 页式管理 多级页表