开启成长之旅!这是我参加「日新计划 2 月更文挑战」的第 3 天,点击检查活动概况

前言

从开始学习机器学习到现在现已有三年了,建模进程以及各类模型运用场景都有个大致的把握。其间我感觉在我全部的机器学习文章中缺少一篇真实引人入门的文章。任何状况迈开学习的第一步都是比较困难的,学习的成本是很高的,相对你学会了收益也高。尤其是机器学习这种数学和逻辑才干强关联的学科,是比较难上手的事,可是当真实做出来了开始上手了便会发生一种振奋高兴感,我感觉这才是我为什么从事数据挖掘建模作业这一原因。写这篇文章我希望其他小伙伴想要入门机器学习的时分不必太过于担心自己的才干,先尝试着迈开自己的第一步做做看。希望咱们喜爱。

希望读者看完能够提出错误或许看法,博主会长期保护博客做及时更新。

一、从意图动身

既然是第一个项目那么我不想搞得那么杂乱,全部从简就好,加上咱还有Python-sklearn这类强力的机器学习剖析库。全部我直接从意图动身,利用鸢尾花(Iris Flower)库来做一个分类,就这么简单。

1.导入数据

那么我刚开始首要需求数据,数据从哪里来呢? 数据一直以来都是做机器学习的一个难题。咱们构建机器学习模型便是要经过很多历史数据去练习模型达到有才干去拟合真值的这么一个进程。而数据质量和数量的好坏决议了模型的上限,从数据的收集到数据的加工和核算都是如此。收集往大的方面讲要涉及到传感器,杂乱的有点云,多维传感器,而简单的从数据库获取用户信息就好。加工数据有专门的ETL小组或许部门来完结,收集到的不同种类数据需求加工的程度也不同,例如敏感数据则还需求脱敏处理,缺失数据则需求补全去除处理。核算的话就更多办法了,现在不单单追求模型的正确率,商业上更追求速度,例如现在盛行的大数据散布式核算框架和神经网络深度学习框架。总归咱们首要不考虑数据的来源,机器学习sklearn库自带鸢尾花数据。Iris 鸢尾花数据集内包括 3 类分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。

  • sepallength:萼片长度
  • sepalwidth:萼片宽度
  • petallength:花瓣长度
  • petalwidth:花瓣宽度

以上四个特征的单位都是厘米(cm)。

这个数据集具有以下特点:

  • 全部的特征数据都是数字,不需求考虑怎么导入和处理数据。
  • 全部的特征的数值单位都是相同的,不需求尺度转化。

我刚开始机器模型建模的时分,总喜爱去作一些进程图来协助自己理清思路,也便利后续寻觅优化切入点。那时我按照规范的建模流程步骤来完成这个项目:

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

二、项目开启

1.导入数据

首要需求引进我即将用到的库:

from sklearn.datasets import load_iris
import pandas as pd

之后只需求登陆数据就能够看到数据的办法了:

iris_data = load_iris()
iris_data_feature=list(iris_data.data)
iris_data_df=pd.DataFrame(iris_data_feature,columns=['花萼长度','花萼宽度','花瓣长度','花瓣宽度'])
iris_data_df

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

其间能够看到iris_data里边的数据主要分为两部分,一部分是data代表了’花萼长度’,’花萼宽度’,’花瓣长度’,’花瓣宽度’这四个维度的数据,而target则为花朵类型数据:

iris_data_class=list(iris_data.target)
iris_class_df=pd.DataFrame(iris_data_class,columns=['花朵类型'])
iris_class_df

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

能够看到数据是非常往常的,准确到小数点后一位,从肉眼观测数据量大的数据集是非常不便利的一件事,咱们需求直观的预览数据。

这儿其实我一开始发现这个数据集是分离开了的,特征数据的数组是data,而标签数组则是target,那么怎么将他们组合起来呢,这儿我查阅资料用到了concat这个函数,pandas真的是数据剖析神器。

经过合并能够得到一张完整的鸢尾花数据表,便利今后绘图和核算:

iris_true_df=pd.concat([iris_data_df,iris_class_df],axis=1)

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

2.预览数据

预览数据的办法有很多种,能够经过数据可视化预览也能够经过数据的核算描述来预览。这儿就能够提现出咱pandas的强大数据剖析功用了,pandas带有许多核算剖析函数,能够快速获得常用核算参数:

iris_true_df.describe()

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

其间 核算值变量阐明:

  • count:数量核算,此列共有多少有效值

  • unipue:不同的值有多少个

  • std:规范差

  • min:最小值

  • 25%:四分之一分位数

  • 50%:二分之一分位数

  • 75%:四分之三分位数

  • max:最大值

  • mean:均值

能够经过标签分组,将不同花朵类型的数据进行分组聚合,检查各个分类的数据散布是否均衡: iris_true_df.groupby('花朵类型').size()

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

能够看到鸢尾花的三个种类的数据都为50条,散布均衡。经过分组能够还能够聚合获取不同类别的花朵各个维度的聚合数据:

iris_true_gy=iris_true_df.groupby('花朵类型')
for name,group in iris_true_gy:
    print(name)
    display(group.head())

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

经过pandas的agg聚合函数就能够完成愈加细化的核算:

iris_true_gy['花萼长度'].agg(['min','mean','max'])

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

3.数据预处理

假如数据的散布不平衡时,或许影响到模型的准确度。因此,当数据散布不平衡时,需求对数据进行处理,调整数据到相对平衡的状态。

数据预处理作为机器学习大的一个课题研讨现现已过了好几十年的经验技能沉淀。

1.过采样

过采样也被称为上采样,这个办法更适用于小数据散布不均衡。假如是大数据散布不均衡,则将本来的小份类别不同的数据集扩充到与类别不同的数据集对等大小的状况。如第一个例子的数据,若进行过采样,则将会有超过26万的数据生成。与欠采样比较核算权重比例以及运算时刻都会大大添加。甚至或许造成过拟合现象。而小数据散布不均衡运用该办法还能防止数据量太少引起的欠拟合。

2.欠采样

欠采样也被称为下采样,一般将将较大的类别数据进行减缩,直至和类型不同的小量数据集相对等。如咱们将例子一的数据进行欠采样,13w的用户行为数据将减缩至6730条数据,进行建模的速度将会大大的加快。

因为该数据集中现已进行了数据预处理故我就不需求进行数据处理了,也节省了我很大的一部分作业。

4.数据可视化

我一开始想到假如把这个数据画成一张图就好了,就相似将Excel的列表数据转化为图表相同,python也能够完成相似作用,这儿只需求我导入matplotlib库就好了: 能够选择matplotlib的字体和主题,以及色彩和输出办法。

import matplotlib.pyplot as plt
from matplotlib import font_manager  # 导入字体管理模块
plt.style.use('ggplot')

单变量图表

单变量图表能够显示每一个独自的特征特点,因为每个特征特点都是数字,因此我能够经过向线图来展现特点与中位值的离散速度:

这儿要注意一下中文字体会出现报错,需求设置指定默认字体。

from pylab import mpl
#mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']    # 指定默认字体:处理plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False           # 处理保存图像是负号'-'显示为方块的问题
iris_data_df.plot(kind='box',subplots=True,layout=(2,2))

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

也能够经过直方图来显示每个特征特点的散布状况:

iris_data_df.hist()

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

这儿会发现花萼长度和花萼宽度、花瓣长度都是契合高斯散布的。

多变量图表

经过多变量图表能够检查不同特征特点之间的联系。经过散点矩阵图来检查每个特点之间的影响联系。

#散点矩阵图
scatter_matrix(iris_data_df)

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

## 第一步,先界说1张空白的大画板
fig=plt.figure(num=1, figsize=(16, 16))
## 添加1个子图,2x2,共4个子图,排第1个
ax1 = fig.add_subplot(221)
ax1.scatter(x=iris_true_df.iloc[:,0:1], y=iris_true_df.iloc[:,4:5],color='k',alpha=0.5)
## 添加1个子图,2x2,共4个子图,排第2个
ax2 = fig.add_subplot(222)
ax2.scatter(x=iris_true_df.iloc[:,1:2], y=iris_true_df.iloc[:,4:5],alpha=0.5)
## 添加1个子图,2x2,共4个子图,排第3个
ax3 = fig.add_subplot(223)
ax3.scatter(x=iris_true_df.iloc[:,2:3], y=iris_true_df.iloc[:,4:5],color='tan',alpha=0.5)
## 添加1个子图,2x2,共4个子图,排第4个
ax4 = fig.add_subplot(224)
ax4.scatter(x=iris_true_df.iloc[:,3:4], y=iris_true_df.iloc[:,4:5],color='c',alpha=0.5)

我初学接触matplotlib觉得有些杂乱,可是经常运用很快就记住函数运用办法:

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

这下能够很直观的发现每个种类的花的各个维度特征都是显着能够区别的,都存在很大的差异性。这样以来我就能够开始进行模型的树立和练习了。

5.练习模型

我需求一部分的数据用来练习模型,一部分的数据用来验证模型的准确度,以便我找到最合适的算法

5.1区分数据集

一般区分数据集采纳2/8切分,其间80%的数据用作练习,20%的数据用作验证。

from sklearn.model_selection import train_test_split
iris_array=iris_true_df.values
X=iris_array[:,0:4]
Y=iris_array[:,4]
test_model=0.2
seed=5
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=test_model,random_state=seed)

5.2评价算法

我这儿就运用十折穿插验证法来评价算法的准确度。十折穿插验证便是随机将数据分红10份:9份用来练习模型,1份用来评价算法。

from sklearn.model_selection import KFold

KFold和K-折验证是相同的。也便是将一份数据集区分红为K份,拿其间的一份用作验证,剩下的k-1份数据用作练习。因此,该KFold这个类也不难理解,也是起数据区分之用。

5.3模型树立

运用sklearn非常便利的一点便是模型只需求import引进就好了,不需求咱们做底层的核算逻辑。项目前期能够调用各种算法来进行测试,可是假如想要真实入门机器学习还得现需求将每个算法都把握一遍才干调优调参愈加准确。 这儿我引进六种算法来进行评测:

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

然后构建六种不同的模型:

models={}
models['LR']=LogisticRegression()
models['LDA']=LinearDiscriminantAnalysis()
models['KNN']=KNeighborsClassifier()
models['CART']=DecisionTreeClassifier()
models['NB']=GaussianNB()
models['SVM']=SVC()

之后我需求树立模型评价算法:

results=[]
for key in models:
    kfold=KFold(n_splits=10,shuffle=True,random_state=seed)
    cv_results=cross_val_score(models[key],X_train,Y_train,cv=kfold,scoring='accuracy')
    results.append(cv_results)
    print('%s:%f(%f)'%(key,cv_results.mean(),cv_results.std()))

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

此时此刻我想假如能够进一步运用数据可视化成果就好了:

#箱线图
fig=pyplot.figure()
fig.suptitle('Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

5.4模型猜测

依据评价显示,LR逻辑回归算法是准确度最高的算法。那么我就用预留的评价数据集给出一个算法模型陈述。

LR=LogisticRegression()
LR.fit(X=X_train,y=Y_train)
predictions=LR.predict(X_test)
print(accuracy_score(Y_test,predictions))
print(confusion_matrix(Y_test,predictions))
print(classification_report(Y_test,predictions))

Python-sklearn机器学习之旅:我的第一个机器学习实战项目

算法的准确度为96.7%,实际项意图猜测准确率都是很低的,这是数据足够简单。

confusion_matrix为混淆矩阵。classification_report提供了每个类别的猜测状况,精准率,召回率,F1。

那么到此我就现已完结了第一个机器学习项目,是一个很规范的建模流程。从导入数据到数据可视化、数据预处理到模型树立和评价,一个方面拆分包括的学识都有很多。相应的每个课题都值得我去深化了解挖掘。而sklearn能够快速树立模型,愈加便利咱们调整参数,能够算是机器学习速成库了。可是想要该愈加准确的选择算法以及构建出交融以及更高级的模型,需求对整个机器学习算法模型有愈加清楚的认知。

如有纰漏之处,请留言指教,非常感谢

以上便是本期全部内容。我是fanstuck ,有问题咱们随时留言讨论 ,咱们下期见。