大数据分析技术

陈清华、田启明、施郁文等

目录

  • 课程简介
    • ● 课程简介
  • 环境准备
    • ● Anaconda环境安装与使用
    • ● Pycharm环境安装
    • ● 常用第三方包的安装与配置
  • 项目一 电影数据统计
    • ● 任务简介
    • ● 数据获取
    • ● 数据解析
    • ● 数据分析
    • ● 数据可视化
    • ● 课堂思政:新型冠状病毒疫情分析与可视化
    • ● 课堂思政:中国工匠精神
  • 项目二 电影数据分析(回归)
    • ● 任务简介
    • ● 使用一元线性回归分析电影票房数据
    • ● 使用多项式回归分析电影票房数据
    • ● 使用多元线性回归分析电影票房数据
    • ● 课堂实训:工资分析
  • 项目三 爬取房产租赁数据
    • ● 任务简介
    • ● 电影数据爬取
    • ● 房产租赁数据爬取
    • ● 房产租赁数据统计
    • ● 课后实训:二手房数据爬取
    • ● 课堂思政:疫情数据的爬取与可视化
  • 项目四 房屋租赁数据分析与可视化
    • ● 任务简介
    • ● 使用箱形图展现租赁价格分布特征
    • ● 使用散点图展现房屋面积与租赁价格的关系
    • ● 使用饼图展现不同行政区域的可租赁房源占比
    • ● 使用折线图可视化房间数与租赁价格的关系
    • ● 使用热力图展现地理位置的影响
    • ● 课后实训:二手房数据分析
    • ● 课堂思政:疫情数据分析与可视化
  • 项目五 身高与体重数据分析(分类器)
    • ● 使用身高、体重数据进行性别分类
      • ● 使用逻辑回归进行性别分类
      • ● 使用朴素贝叶斯进行性别分类
      • ● 使用决策树模型进行性别分类
      • ● 使用支持向量机进行性别分类
    • ● 使用支持向量机进行肥胖程度分类
    • ● 课后实训: 身高体重数据分析(分类器)
  • 项目六 鸢尾花分类
    • ● 任务简介
    • ● 使用K近邻对鸢尾花进行分类
    • ● 使用随机森林对鸢尾花进行分类
    • ● 使用神经网络对鸢尾花进行分类
  • 项目七 电影评分数据分析(聚类)
    • ● 任务简介
    • ● 使用BDSCAN确定质心个数
    • ● 使用K-Means对观影用户进行聚类
  • 项目八 人脸检测与人脸识别
    • ● 任务简介
    • ● 图像中的人脸检测
    • ● 视频中的人脸检测
    • ● 图像中的人脸识别
    • ● 视频中的人脸识别
    • ● 课后实训:眼睛与笑脸检测
    • ● 课堂思政:人工智能与弯道超车
  • 项目九 手写数字识别应用
    • ● 任务简介
    • ● 图像数据集准备
    • ● 使支持向量机识别手写数字
    • ● 使用神经网络识别手写数字
    • ● 课后实训:使用不同的机器学习方法识别数字手写体
  • 项目十  深度学习在行为识别中的应用
    • ● 任务简介
    • ● 使用卷积神经网络识别行为
    • ● 使用循环神经网络识别行为
    • ● 课后实训:电影评论数据分析
  • 项目十一 TensorFlow与神经网络
    • ● 任务简介
    • ● 使用单层神经网络预测花瓣宽度
    • ● 设计多层神经网络实现鸢尾花分类
    • ● 课后实训:卷积神经网络的实现与应用
  • 项目综合实训(17级学生案例)
    • ● 综合实训要求
    • ● 确定数据采集目标
    • ● 数据采集与预处理
    • ● 数据统计与分析
    • ● 数据分析与预测
    • ● 数据分类应用
    • ● 17级实训案例:二手车数据获取与市场分析
使支持向量机识别手写数字

任务1.1:使用sklearn中的SVM实现手写数字识别。

  • 步骤一:读取数据,参考代码如下:

 

# 导入必备的包
 
import numpyas  np
 
import struct
 
import os
 
# 定义加载所有训练数据集的函数
 
def load_mnist_train():   
     labels_path =
'mnist/train-labels.idx1-ubyte'
    
images_path  = 'mnist/train-images.idx3-ubyte'
    
with open(labels_path,  'rb') as lbpath:
        
magic,  n =  struct.unpack('>II',lbpath.read(8))
         labels = np.
fromfile(lbpath,dtype=np.uint8)
    
with open(images_path,  'rb') as imgpath:
        
magic,  num,  rows,  cols  =  struct.unpack('>IIII',imgpath.read(16))
         images = np.
fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)
    
return  images, labels
 
# 定义加载所有测试集数据集的函数
 
def load_mnist_test():
     labels_path =
'mnist/t10k-labels.idx1-ubyte'
    
images_path  = 'mnist/t10k-images.idx3-ubyte'
    
with open(labels_path,  'rb') as lbpath:
        
magic,  n =  struct.unpack('>II',lbpath.read(8))
         labels = np.
fromfile(lbpath,dtype=np.uint8)
    
with open(images_path,  'rb') as imgpath:
        
magic,  num,  rows,  cols  =  struct.unpack('>IIII',imgpath.read(16))
         images = np.
fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)
    
return  images, labels
 
# 加载数据集
 
train_images, train_labels = load_mnist_train()
 test_images, test_labels = load_
mnist_test()

 
  • 步骤二:准备数据,参考代码如下:

 

from sklearnimport  preprocessing
 
# 60000个训练数据集
 
x = preprocessing.StandardScaler().fit_transform(train_images)
 x_train = x[
0:60000]
 y_train = train_labels[
0:60000]
 
# 10000个测试数据集
 
x = preprocessing.StandardScaler().fit_transform(test_images)
 x_test = x[
0:10000]
 y_test = test_labels[
0:10000]

 
  • 步骤三:训练模型,参考代码如下:

 

加载svm机器方法
 
from sklearnimport  svm
 
import time
 
print('开始训练....')
 
print(time.strftime('%Y-%m-%d  %H:%M:%S'))
 model_svc =
svm.LinearSVC()
 model_svc.fit(x_train,y_train)
 
print('结束训练....')
 
print(time.strftime('%Y-%m-%d  %H:%M:%S'))

 
  • 步骤四:对测试数据进行模型评估,参考代码如下:

 

print('预测开始....')
 y_
pred = model_svc.predict(x_test)
 
print('10000个测试数据的测试准确率:')
 
print(model_svc.score(x_test,y_test))

 

上述输出结果如图所示,准确率约为91%左右。训练线性SVM模型大约用时10分30秒。

 


也可以调用模型评估报告来查看,参考代码如下:

 

from sklearn.metrics  import classification_report
 
 
print(classification_report(y_pred, y_test))

 

出具的更详细的模型评估结果如图9.6所示。其中,“0,4,6”的预测精确度相对较高。


任务1.2:可视化

为更好地找到出错的图像用于分析,我们用不同颜色或位置来显示错误的预测结果。可视化显示预测结果与图片的对应关系,参考代码如下:

 

import matplotlib.pyplotas  plt
 
 
print('100张测试图像的预测结果')
 
# 显示前100个样本的真实标签和预测值,用图显示
 
fig1=plt.figure(figsize=(8,8))
 fig1.subplots_adjust(
left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05)
 
for i in range(100):
    
# 子图显示第i张图
    
ax=fig1.add_subplot(10,10,i+1,xticks=[],yticks=[])
     ax.
imshow(np.reshape(test_images[i],  [28,28]),cmap=pltNaN.binary,interpolation='nearest')
    
# 在图上方显示预测结果值
    
ax.text(20,  20,  str(y_pred[i]), color='blue',size  = 20)
 
plt.show()

 

    下图显示了前50张图片的具体预测结果。

                          

任务1.3:为更好地找到出错的图像用于分析,我们用不同颜色或位置来显示错误的预测结果。

要求结果如图所示。


模型训练好后,我们就可以用它来做手写数字识别。当有新的手写体过来时,可以调用该训练好模型进行判别。

在机器学习模型中,需要人工选择的参数称为超参数。比如随机森林中决策树的个数,人工神经网络模型中的隐藏层层数和每层的节点个数,正则中常数大小等等,它们都需要事先指定。参数选择不恰当,就会出现拟合或者过拟合的问题。

我们在选择参数有两个途径:一是凭经验;二是选择不同大小的参数代入到模型中,挑选表现最好的参数。通过途径二选择参数时,人力手动调节注意力成本太高,非常不值得。For循环或类似于for循环的方法受限于太过分明的层次,不够简洁与灵活,注意力成本高,易出错。

GridSearchCV称为网格搜索交叉验证调参,它通过遍历传入的参数的所有排列组合,通过交叉验证的方式,返回所有参数组合下的评价指标得分。GridSearchCV实质是暴力搜索。该方法在小数据集上很有用,数据集大了就不太适用了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力。

任务1.4:使用GridSearchCV为SVM寻找参数识别手写字体。

使用GridSearchCV调参考方法,训练SVM模型的参考代码如下:

 

from sklearn.model_selection  import GridSearchCV
 
# 调用GridSearchCV,为SVC()寻找最优参数
 
clf = GridSearchCV(SVC(class_weight='balanced'),  param_grid={"C":[0.1,  1,  20,  10],  "gamma":[0.01,5,0.1]},  cv=4)
 
# 用训练集训练SVC
 
clf.fit(x_train, y_train)

 

    同样,对于训练好的模型,可以对比一下,是否有更高的识别准确率。但是,在寻找最优参数过程相对耗时。