2019-11-21 18:18:19 CSDNedu 阅读数 356
  • 从零开始学习机器学习视频教程

    零基础入门机器学习视频培训课程概况:机器学习数学基础、Python基础、机器学习算法(线性回归、逻辑回归、聚类算法、EM算法),机器学习项目实战(Kmeans篮球数据分析、贝叶斯算法训练)、推荐算法、项目实战。  任务作业:很多人都喜欢看NBA,也喜欢拿实力相近的球员进行比较,你能利用机器学习的方式进行分析吗?动手的机会来了!请 结合课程【项目实战】章节中的【Kmeans篮球数据分类】。从NBA网站中随机拿到30名篮球运动员的得分和助攻(尽量数据间隔较大)。用python对数据进行处理(换算成每分钟的得分和助攻)。然后用Kmeans对获取的球员进行分类。看看自己心仪的球员属于哪一类~  (温馨提示: 注意 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

    5410 人正在学习 去看看 陆永剑

近日,华为20亿奖励员工的新闻频频刷屏。

其中20亿奖金不是面向所有的华为员工,20亿奖金包涉及到的是研发体系、造AI芯片和建设生态的员工。

从5G开始部署以来,华为获得了来自全球各地运营商的订单,签订了40多个5G商用合同。另外华为的智能手机在今年一季度的销量已达到5900万台。

这足以表明华为对技术、人才的高度重视,同时带来的高回报!

不过,华为对技术、人才的重视,不止于此。早前,华为就宣布:计划投入10亿元人民币用于AI人才培养;在开发者方面,计划三年培养100万开发者。

同时侧面也反映了AI在华为的重要地位。

这也不用感到奇怪,据腾讯研究院一份研究报告显示,全球AI领域人才约30万,而市场需求在百万量级。每年毕业于AI领域的学生约2万人,远远不能满足市场对人才的需求。

今年4月,猎聘网发布的人才报告显示,2019年第一季度,AI相关职位需求同比增长为44.30%,平均年薪达到26.38万元。

BOSS直聘研究院的数据显示,2018年,所有要求掌握AI、算法、智能识别等相关技能的岗位,AI年度薪资总和规模至少达到15亿元,较2017年增长5.8倍!

以北京AI工程师平均工资为例:(来自于职友集2019年11月19日信息)

工资水平较其他开发岗位确实高出不少,因为人工智能毕竟还处于发展阶段,所以人才的培养远远满足不了市场的需求。

看到这里,很多人都想问一句:现在开始学还来得及吗?

我想说的是:人工智能还是一片等待人们开发的蓝海,现在入局为时未晚,这就是时代给转行人士的一份大礼。

CSDN精心打磨了一套针对转型/进阶同学的+书复合课程《决胜AI—机器学习+深度学习系列实战200讲》

课程会赠送1本京东排行榜上实用性TOP10的AI工具书,同时通过图书教材与视频课程的组合让你系统学习人工智能,做到融汇贯通。

| 图书邮寄 | 视频精讲 | 项目实战 | 社群答疑 | 

超值套餐99元,点击链接:https://t.csdnimg.cn/jRdv

输入优惠码ai10立减¥10限前100名

 

俘获程序员喜爱

97%的好评,4万程序员在看

这门课程究竟好在哪?

 

课程亮点:系统学习人工智能

1、机器学习+深度学习核心内容面面俱到

2、基于Python主流趋势持续更新,一劳永逸

3、书籍+线上复合型场景,多样化学习方式,轻松不累

4、录播课程随到随学,社群答疑解决学习难题

5、面向企业需求,零基础及进阶人工智能工程师准备

6、提供项目实战资料及源码,轻松复现

 

#核心课程内容摘录#
 

 

#视频课+图书教材#

送98%好评、3万程序员在学的京东实用性TOP10的AI工具书:

 

| 图书邮寄 | 视频精讲 | 项目实战 | 社群答疑 | 

超值套餐99元,点击链接:https://t.csdnimg.cn/jRdv

输入优惠码ai10立减¥10限前100名

 

#报名领书还送2门课#

报名课程更免费送2门会员专属机器学习课程,让你彻底弄明白人工智能。相当于99元购买了4门课程+1本书

赠送课程一:机器学习算法基础

课程介绍:课程共83节,多行业实战项目,同步配套完整代码,0基础小白也能学。

赠送课程二:机器学习——线性回归数学推导

课程介绍:课程共5节,带领你一步一步的推导线性回归,深入了解线性回归方面的知识点。同时,总结了人工智能基础算法的所有知识点,帮助你打下坚实的基础。

 

#你将收获#

  • 1本实体图书教材,京东畅销书《智能问答与深度学习》含邮寄

  • 5大模块,涉及机器学习算法、神经网络、中文分词等AI热点领域,成为AI技术高手

  • 200讲机器学习+深度学习系列实战,将理论与实战相结合,做到真正的学以致用

  • 专属微信社群,随时答疑,将AI彻底掌握

 

| 图书邮寄 | 视频精讲 | 项目实战 | 社群答疑 | 

超值套餐99元,点击链接:https://t.csdnimg.cn/jRdv

输入优惠码ai10立减¥10限前100名

 

如果你有其他疑问

请添加CSDN小姐姐,入群解答

(回复数字2入群)

2019-05-21 20:41:54 qq_39577697 阅读数 366
  • 从零开始学习机器学习视频教程

    零基础入门机器学习视频培训课程概况:机器学习数学基础、Python基础、机器学习算法(线性回归、逻辑回归、聚类算法、EM算法),机器学习项目实战(Kmeans篮球数据分析、贝叶斯算法训练)、推荐算法、项目实战。  任务作业:很多人都喜欢看NBA,也喜欢拿实力相近的球员进行比较,你能利用机器学习的方式进行分析吗?动手的机会来了!请 结合课程【项目实战】章节中的【Kmeans篮球数据分类】。从NBA网站中随机拿到30名篮球运动员的得分和助攻(尽量数据间隔较大)。用python对数据进行处理(换算成每分钟的得分和助攻)。然后用Kmeans对获取的球员进行分类。看看自己心仪的球员属于哪一类~  (温馨提示: 注意 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

    5410 人正在学习 去看看 陆永剑

利用机器学习拟合复杂函数,并利用遗传算法求最优解


编程语言:Python
利用工具:sklearn、keras、geatpy
步骤原理简述:
1、利用机器学习到数据集的多维特征和输出的拟合函数关系(模型去学,并保存模型)。
2、加载模型函数,利用遗传算法找到该函数的最优解(实际是在不同约束条件下的变量值中,求取拟合函数的最大值或最小值)
工具介绍:
   1、sklearn: https://scikit-learn.org/stable/ 官网教程网页,我利用了其中的Regression(回归模型),利用pipeline(将数据预处理和模型训练集成在一起)
基于sklearn的回归模型去拟合,模型如下(采用了LinearRegression和TheilSenRegressor/XGBRegressor(因为数据集较简单采用了线性拟合模型)),sklear提供的回归模型其余多种类型。拟合效果如下:

#LinearRegression
Pipeline([
    ('scale', MinMaxScaler()),
    ('reg', linear_model.LinearRegression())
])
data_size: 6715	
mse: 36.539681516210784	rmse: 6.044806160350452	mae:4.63826039731241	
mape: 3.3011660989748934	r2: 0.808433725049098

#TheilSenRegressor
Pipeline([
    ('scale', StandardScaler()),
    ('reg', TheilSenRegressor(random_state=5))
])
data_size: 6715	
mse: 35.90317863408285	rmse: 5.9919261205461 mae:4.5948612203764805	mape: 3.281180987786468	r2: 0.8117707132511071```

#XGBRegressor
Pipeline([
 ('scale', StandardScaler()),
    ('reg', XGBRegressor(max_depth=5, n_estimators=100, n_jobs=8))
])
data_size: 6715	
mse: 44.95695040186879	rmse: 6.704994437124373	mae: 5.23324546786106	  
mape: 3.69434252416818	r2: 0.7643045816418063

   2、keras,官网教程https://keras.io/zh/ 因为数据集较简单,试验过程,具体结构与结果记录如下:

基于keras神经网络的回归拟合
Keras1: (别人原始输出)
 y: _Power_chiller	data_size: 6715	
mse: 109.89059902559949	rmse: 10.482871697469138	mae: 8.92583014113255
mape: 6.267563752145885	r2: 0.4238774988195254


keras2:
model.add(Dense(output_dim=1, input_dim=9))
model.compile(loss='mean_squared_error', optimizer='sgd')
data_size: 6715	
mse: 34.67461192389513 	rmse: 5.888515256318449	mae: 4.535644083885483	
mape: 3.2163304659323524	r2: 0.8182117094074346

keras3:
model.add(Dense(4,input_dim=9,activation='sigmoid'))
model.add(Dense(1,activation='linear')data_size: 6715mse: 
mse: 105.27507699250788	rmse: 10.26036436938318	mae: 8.179505252179268	
mape: 5.890991045203168	r2: 0.4480752566035091


keras4:
model.add(Dense(4,input_dim=9,activation='sigmoid'))
model.add(Dense(4, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
data_size: 6715	
mse: 116.41971469072959	rmse: 10.789796786350037	mae: 8.7450677473619	
mape: 6.026414498738246	r2: 0.38964736011025247

keras5:
model.add(Dense(18,input_dim=9,activation='sigmoid'))
model.add(Dense(18, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
data_size: 6715	mse: 126.90706426348436	rmse: 11.26530355842595	
mae: 8.772541177423156	mape: 6.09706260143816	r2: 0.33466542243602104

keras6:
model.add(Dense(18,input_dim=9,activation='sigmoid'))
model.add(Dense(18, activation='sigmoid'))
model.add(Dense(1, activation='linear'))
data_size: 6715	mse: 92.46484791330296	rmse: 9.61586438721465	mae: 6.507704671795376
mape: 4.631009747366009	r2: 0.5152353347471101

3、拟合函数求到后,利用geatpy求取使输出值最小的变量
工具介绍:
geatpy:http://www.geatpy.com/start
Geatpy提供了许多已实现的遗传和进化算法相关算子的库函数,如初始化种群、选择、交叉、变异、重插入、多种群迁移、多目标优化非支配排序等,并且提供开放式的进化算法框架来实现多样化的进化算法。其执行效率高于Matlab遗传算法工具箱和Matlab第三方遗传算法工具箱Gaot、gatbx、GEATbx,学习成本低。
Geatpy支持二进制/格雷码编码种群、实数值种群、整数值种群、排列编码种群。支持轮盘赌选择、随机抽样选择、锦标赛选择。提供单点交叉、两点交叉、洗牌交叉、部分匹配交叉(PMX)、线性重组、离散重组、中间重组等重组算子。提供简单离散变异、实数值变异、整数值变异、互换变异等变异算子。支持随机重插入、精英重插入。支持awGA、rwGA、nsga2、快速非支配排序等多目标优化的库函数、提供进化算法框架下的常用进化算法模板等。

""" main.py """

import numpy as np
from keras.engine.saving import load_model
from sklearn import preprocessing
import geatpy as ga

# 定义目标函数
def aimfuc(variables,LegV):
   #模型路径
    path = "/home/lyw/桌面/workworkworkworkworkworkwork/GDS_SZ2/saved_models/B_chiller_power"
    #加载模型
    model = load_model(path + '-keras')
    #模型预处理
    scaler = preprocessing.MinMaxScaler()
    train_data = scaler.fit_transform(variables)
    #模型预测
    pred = model.predict(train_data)
    # 约束条件
    x1 = variables[:, [0]] # get x1
    x2 = variables[:, [1]] # get x2
    idx1 = np.where(x1 + x2 > 40)[0]
    exIdx = np.unique(np.hstack([idx1])) # 得到非可行解个体的下标
    LegV[exIdx] = 0 # 标记非可行解在种群可行性列向量中对应的值为0(0表示非可行解,1表示可行解)
    return [pred,LegV]

def punishing(LegV, FitnV):
    FitnV[np.where(LegV == 0)[0]] = 0 # 惩罚非可行解个体的适应度
    return FitnV

if __name__ == "__main__":
    AIM_M = __import__('main') # 获取目标函数地址
    PUN_M = __import__('main') # 获取罚函数地址
    # 变量设置
    x1 = [20, 25]                        # 自变量t的范围
    x2 = [16, 20]                        # 自变量wet_temp的范围
    x3 = [-5,5]                         # 自变量_T_CHW_diff的范围
    x4 = [50,55]                         # 自变量_CHW的范围
    x5 = [5,10]                          # 自变量_COW的范围
    x6 = [435,440]                        # 自变量_WTF1的范围
    x7 = [5,10]                           # 自变量_WTF3的范围
    x8 = [35,40]                           # 自变量_F_fan的范围
    x9 = [40,43]                           # 自变量__F_pump的范围
    b1 = [1, 1]                          # 自变量1-9是否包含下界
    b2 = [1, 1]
    b3 = [1, 1]
    b4 = [1, 1]
    b5 = [1, 1]
    b6 = [1, 1]
    b7 = [1, 1]
    b8 = [1, 1]
    b9 = [1, 1]
    ranges = np.vstack([x1, x2,x3,x4,x5,x6,x7,x8,x9]).T       # 生成自变量的范围矩阵
    borders = np.vstack([b1, b2,b3,b4,b5,b6,b7,b8,b9]).T      # 生成自变量的边界矩阵
    FieldDR = ga.crtfld(ranges, borders) # 生成区域描述器
    # 调用Geatpy内置进化算法模板
    [pop_trace, var_trace, times] = ga.sga_new_real_templet(AIM_M, 'aimfuc', PUN_M, 'punishing', FieldDR, problem = 'I', maxormin = 1, MAXGEN = 10, NIND = 1000, SUBPOP = 1, GGAP = 0.9, selectStyle = 'tour', recombinStyle = 'xovdp', recopt = 0.9, pm = 0.3, distribute = True, drawing = 1)

利用geatpy 改写比较困难,但利用geatpy提供的算法框架改写就很便利,只需要对目标函数进行更好,例如本文直接利用 ga.sga_new_real_templet模板。
同时geatpy提供的模板多达十几种,使用说明网址:https://github.com/geatpy-dev/geatpy/tree/master/geatpy/source-code/templets

最后优化结果如下:

1、最优的目标函数值为:107.97457885742188
最优的控制变量值为:
21.0
16.0
5.0
50.0
10.0
435.0
10.0
39.0
41.0
有效进化代数:100
最优的一代是第 30 代
时间已过 1657.3300688266754 秒

2、最优的目标函数值为:107.97457885742188
最优的控制变量值为:
21.0
16.0
5.0
50.0
10.0
435.0
10.0
39.0
41.0
有效进化代数:50
最优的一代是第 44 代
时间已过 365.3190333843231 秒

3、最优的目标函数值为:107.97457885742188
最优的控制变量值为:
21.0
16.0
5.0
50.0
10.0
435.0
10.0
39.0
41.0
有效进化代数:50
最优的一代是第 22 代
时间已过 375.3887228965759 秒
4、最优的目标函数值为:108.38638305664062
最优的控制变量值为:
21.0
16.0
5.0
50.0

谢谢大家的观看~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~进来了就点个赞呗~~~~~~~~`

2019-06-07 22:13:07 weixin_43582101 阅读数 251
  • 从零开始学习机器学习视频教程

    零基础入门机器学习视频培训课程概况:机器学习数学基础、Python基础、机器学习算法(线性回归、逻辑回归、聚类算法、EM算法),机器学习项目实战(Kmeans篮球数据分析、贝叶斯算法训练)、推荐算法、项目实战。  任务作业:很多人都喜欢看NBA,也喜欢拿实力相近的球员进行比较,你能利用机器学习的方式进行分析吗?动手的机会来了!请 结合课程【项目实战】章节中的【Kmeans篮球数据分类】。从NBA网站中随机拿到30名篮球运动员的得分和助攻(尽量数据间隔较大)。用python对数据进行处理(换算成每分钟的得分和助攻)。然后用Kmeans对获取的球员进行分类。看看自己心仪的球员属于哪一类~  (温馨提示: 注意 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

    5410 人正在学习 去看看 陆永剑

最近喜欢先把测试结果图放前面。大家可以先看下效果。
在这里插入图片描述
识别速度并不是很快,代码并没有进一步优化。

本篇主要讲的是 从制作验证码开始,到我们利用机器学习识别出来结果的过程。

利用机器学习识别验证码的思路是:让计算机经过大量数据和相应标签的训练,计算机习得了各种不同标签之间的差别与关系。形成一个庞大的分类器。此时再向这个分类器输入一张图片。分类器将输出这个图片的“标签”。图片识别过程就完毕了。

下面我们正式开始本篇内容。

一:生成验证码:

这里生成验证码的方式是使用了python的PIL库。 他已经是Python平台上的图像处理标准库了。PIL功能非常强大,API也非常简单易用。

这里就放代码吧。

import random,os
from PIL import ImageFont,Image,ImageDraw,ImageFilter
def auth_code():
    size = (140,40)                             #图片大小
    font_list = list("0123456789")             #验证码范围
    c_chars = "  ".join(random.sample(font_list,4))  # 4个+中间加个俩空格
    print(c_chars)
    img = Image.new("RGB",size,(33,33,34))      #RGB颜色
    draw = ImageDraw.Draw(img)                  #draw一个
    font = ImageFont.truetype("arial.ttf", 23)      #字体
    draw.text((5,4),c_chars,font=font,fill="white") #字颜色
    params = [1 - float(random.randint(1, 2)) / 100,
              0,
              0,
              0,
              1 - float(random.randint(1, 10)) / 100,
              float(random.randint(1, 2)) / 500,
              0.001,
              float(random.randint(1, 2)) / 500
              ]
    img = img.transform(size, Image.PERSPECTIVE, params)
    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    img.save(f'./test_img/{c_chars}.png')
    
if __name__ == '__main__':
    if not os.path.exists('./test_img'):
        os.mkdir('./test_img')
    while True:
        auth_code()
        if len(os.listdir('./test_img'))>=3000:     # 你改成 10000就行了
                                #我这个电脑太老了。
            break

运行之后,就在 test_img 生成了如图所示的验证码图片。我这里是直接在生成时候以图片名 标注了 验证码对应的数字。 因为做案例嘛,不想再去爬验证码然后手动标注了。很累的!!
在这里插入图片描述

我这里生成的图片还是很干净的。如果你要搞比较复杂一点的图片,可以去看看下面贴的博客。
在这里插入图片描述
之前写过一篇利用opencv进行验证码处理,感兴趣可以看看,本篇的验证码并没有过多处理:https://blog.csdn.net/weixin_43582101/article/details/90609399

二:验证码分割

这里是要把我们生成的验证码,给切成4份,按照不同的标注,放到 train_data_img 不同的0—9的文件夹里面。
在这里插入图片描述
这个样子。做一个训练集。我这里分割也是处理的比较简单,按照宽度直接除以4 =。=

import os
from PIL import Image
from sklearn.externals import joblib
import time
def read_img():
    img_array = []
    img_lable = []
    file_list = os.listdir('./test_img')
    for file in file_list:
        try:
            image = file
            img_array.append(image)
        except:
            print(f'{file}:图像已损坏')
            os.remove('./test_img/'+file)
    return img_array


def sliceImg(img_path, count = 4):
    if not os.path.exists('train_data_img'):
        os.mkdir('train_data_img')
    for i in range(10):
        if not os.path.exists(f'train_data_img/{i}'):
            os.mkdir(f'train_data_img/{i}')
    img = Image.open('./test_img/'+img_path)
    w, h = img.size
    eachWidth = int((w - 17) / count)
    img_path = img_path.replace(' ', '').split('.')[0]

    for i in range(count):
        box = (i * eachWidth, 0, (i + 1) * eachWidth, h)
        img.crop(box).save(f'./train_data_img/{img_path[i]}/'+img_path[i]+ str(time.time()) + ".png")

if __name__ == '__main__':
    img_array = read_img()
    for i in img_array:
        print(i)
        sliceImg(i)

跑完之后,每个文件夹下面都有对应的验证码图片,并且他们的标注时图片名的首字母。
在这里插入图片描述

三:验证码特征提取

这里的思路是:利用 numpy 先把 train_data_img 图片转换成向量,我没有转01,嫌麻烦=。=

from PIL import Image
import numpy as np
import os
from sklearn.neighbors import KNeighborsClassifier as knn
def img2vec(fname):
    '''将图片转为向量'''
    im = Image.open(fname).convert('L')
    im = im.resize((30,30))
    tmp = np.array(im)
    vec = tmp.ravel()
    return vec

然后利用我们标注好的标签,来做一个特征提取,

tarin_img_path = 'train_data_img'
def split_data(paths):
    X = []
    y = []
    for i in os.listdir(tarin_img_path):
        path = os.path.join(tarin_img_path, i)
        fn_list = os.listdir(path)
        for name in fn_list:
            y.append(name[0])
            X.append(img2vec(os.path.join(path,name)))
    return X, y                 # x向量   y标签

然后构建一个分类器,

def knn_clf(X_train,label):
    '''构建分类器'''
    clf = knn()
    clf.fit(X_train,label)
    return clf

这里使用的是sklearn中的knn,我直接调包了。如果想看手写版本的,可以看之前写的KNN手写数字识别。https://blog.csdn.net/weixin_43582101/article/details/88772273

构建完分类器后,就可以把上面的结合起来,做一个识别模型了。

def knn_shib(test_img):
    X_train,y_label = split_data(tarin_img_path)
    clf = knn_clf(X_train,y_label)
    result = clf.predict([img2vec(test_img)])
    return result

四:验证码识别

我前面忘记搞测试集了,这次还是使用上面生成验证码的方法来生成一点测试集。

import random,time
import os
from PIL import ImageFont,Image,ImageDraw,ImageFilter
def auth_code():
    size = (140,40)                             #图片大小
    font_list = list("0123456789")             #验证码范围
    c_chars = "  ".join(random.sample(font_list,4))  # 4个+中间加个俩空格
    print(c_chars)
    img = Image.new("RGB",size,(33,33,34))      #RGB颜色
    draw = ImageDraw.Draw(img)                  #draw一个
    font = ImageFont.truetype("arial.ttf", 23)      #字体
    draw.text((5,4),c_chars,font=font,fill="white") #字颜色
    params = [1 - float(random.randint(1, 2)) / 100,
              0,
              0,
              0,
              1 - float(random.randint(1, 10)) / 100,
              float(random.randint(1, 2)) / 500,
              0.001,
              float(random.randint(1, 2)) / 500
              ]
    img = img.transform(size, Image.PERSPECTIVE, params)
    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
    random_name = str(time.time())[-7:]
    img.save(f'./test_data_img/{random_name}.png')
if __name__ == '__main__':
    if not os.path.exists('./test_data_img'):
        os.mkdir('./test_data_img')
    while True:
        auth_code()
        if len(os.listdir('./test_data_img'))>=30:
            break

测试集图片保存在 test_data_img 中,但是现在的图片是完整的,我们想要识别,就要按照之前的方法先进行图片切割,分成4份,然后拿我们的模型来识别。

from lx3验证码特征提取 import *
from lx2验证码分割     import *

def sliceImg(img_path, count = 4):
    if not os.path.exists('test_split_img'):
        os.mkdir('test_split_img')
    img = Image.open(img_path)
    w, h = img.size
    eachWidth = int((w - 17) / count)
    for i in range(count):
        box = (i * eachWidth, 0, (i + 1) * eachWidth, h)
        img.crop(box).save('./test_split_img/' + f"{i+1}.png")

if __name__ == '__main__':
    test_data_img = r'test_data_img\.059682.png'
    sliceImg(test_data_img)
    result = []
    for img in os.listdir('test_split_img'):
        result.append(knn_shib('test_split_img/'+img)[0])
    print(result)

到这里其实就结束了,这里的代码主要还是以案例为主,并没有进行优化,很多地方都需要改进,一些细节也没有处理,感兴趣的同学大家可以自己再进行改进。

祝大家端午节快乐啊。

数据和代码都放在github。可直接下载,https://github.com/lixi5338619/OCR_Yanzhengma/tree/master

2018-11-07 22:32:14 qq_41185868 阅读数 8306
  • 从零开始学习机器学习视频教程

    零基础入门机器学习视频培训课程概况:机器学习数学基础、Python基础、机器学习算法(线性回归、逻辑回归、聚类算法、EM算法),机器学习项目实战(Kmeans篮球数据分析、贝叶斯算法训练)、推荐算法、项目实战。  任务作业:很多人都喜欢看NBA,也喜欢拿实力相近的球员进行比较,你能利用机器学习的方式进行分析吗?动手的机会来了!请 结合课程【项目实战】章节中的【Kmeans篮球数据分类】。从NBA网站中随机拿到30名篮球运动员的得分和助攻(尽量数据间隔较大)。用python对数据进行处理(换算成每分钟的得分和助攻)。然后用Kmeans对获取的球员进行分类。看看自己心仪的球员属于哪一类~  (温馨提示: 注意 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

    5410 人正在学习 去看看 陆永剑

ML/DL之预测分析类:利用机器学习算法进行预测分析的简介、分析、代码实现之详细攻略

 

 

目录

机器学习算法进行预测的简介

机器学习算法进行预测的分析

机器学习算法进行预测的代码实现


 

 

 

机器学习算法进行预测的简介

1、推荐论文
《An Empirical Comparison of Supervised Learning Algorithms》 Rich Caruana,Alexandru Niculescu-Mizi。
《An Empirical Evaluation of Supervised Learning in High Dimensions》 Rich Caruana, Nikos Karampatziakis,Ainur Yessenalina
        这两篇论文中,作者选择了各种分类问题,用各种不同的算法来构建预测模型。然后测试这些预测模型在测试数据中的效果,这些测试数据当然不能应用于模型的训练阶段,对这些算法根据性能进行打分。
       第一篇论文针对11 个不同的机器学习问题(二元分类问题)对比了9 个基本算法。所选问题来源广泛,包括人口统计学、文本处理、模式识别、物理学和生物学。表1-1 列出了此篇论文所用的数据集,所用名字与论文中的一致。此表还展示了针对每个数据集做预测时使用了多少属性(特征)以及正例所占的百分比。

 

 

机器学习算法进行预测的分析

更新……

 

 

机器学习算法进行预测的代码实现

更新……

 

 

 

 

2020-01-06 14:30:31 duxinshuxiaobian 阅读数 276
  • 从零开始学习机器学习视频教程

    零基础入门机器学习视频培训课程概况:机器学习数学基础、Python基础、机器学习算法(线性回归、逻辑回归、聚类算法、EM算法),机器学习项目实战(Kmeans篮球数据分析、贝叶斯算法训练)、推荐算法、项目实战。  任务作业:很多人都喜欢看NBA,也喜欢拿实力相近的球员进行比较,你能利用机器学习的方式进行分析吗?动手的机会来了!请 结合课程【项目实战】章节中的【Kmeans篮球数据分类】。从NBA网站中随机拿到30名篮球运动员的得分和助攻(尽量数据间隔较大)。用python对数据进行处理(换算成每分钟的得分和助攻)。然后用Kmeans对获取的球员进行分类。看看自己心仪的球员属于哪一类~  (温馨提示: 注意 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

    5410 人正在学习 去看看 陆永剑

全文共6787字,预计学习时长20分钟

来源:Pexels

 

 

概述

 

  • 流数据是一个在机器学习领域蓬勃发展的概念
  • 学习如何使用PySpark来利用机器学习模型对流数据进行预测
  • 我们将介绍流数据和Spark Streaming的基础知识,然后深入到实现部分

 

 

引言

想象一下——每一秒都有8,500多条推文发布,900多张照片被上传到Instagram,4,200多个Skype呼叫,78,000多次Google搜索,以及200多万封电子邮件被发送(数据来自InternetLive Stats)。

 

我们正在以前所未有的速度和规模生产数据。这是在数据科学领域工作的大好时候!但是有了大量的数据后,接踵而至的是复杂的挑战。

 

首要,如何收集大规模的数据?如何确保一旦生成并收集数据,机器学习管道就会继续产生结果?这些都是业界面临的重大挑战,以及为什么流数据的概念在企业中越来越受到关注。

 

 

 

增加处理流数据的能力将极大地扩展当前的数据科学产品投资组合。这是业界急需的技能,若能熟练掌握它,将帮助你担负起下一个数据科学角色。

 

因此,在本文中,我们将学习什么是流数据,了解Spark Streaming的基础知识,然后在一个业界相关的数据集上使用Spark实现流数据。

 

 

目录

 

1. 什么是流数据?

2. Spark Streaming的基础知识

3. 离散流

4. 缓存

5. 检查点

6. 流数据的共享变量

7. 累加器变量

8. 广播变量

9. 使用PySpark对流数据进行情感分析

 

 

什么是流数据?

 

社交媒体产生的数据是惊人的。你敢于想象存储所有数据需要些什么吗?这是一个复杂的过程!因此,在深入探讨本文的Spark方面之前,先来理解什么是流数据。

 

流数据没有离散的开始或结束。这些数据是每秒从数千个数据源中生成的,它们需要尽快进行处理和分析。大量流数据需要实时处理,例如Google搜索结果。

 

我们知道,在事件刚发生时一些见解会更有价值,而随着时间的流逝它们会逐渐失去价值。以体育赛事为例——我们希望看到即时分析,即时统计见解,在那一刻真正享受比赛,对吧?

 

例如,假设你正在观看一场罗杰·费德勒(Roger Federer)对战诺瓦克·乔科维奇(Novak Djokovic)的激动人心的网球比赛。

 

这场比赛两局打平,你想了解与费德勒的职业平均水平相比,其反手发球的百分比。是在几天之后看到有意义,还是在决胜局开始前的那一刻看到有意义呢?

来源:Pexels

 

 

Spark Streaming的基础知识

 

Spark Streaming是核心Spark API的扩展,可实现实时数据流的可伸缩和容错流处理。

 

在转到实现部分之前,先了解一下Spark Streaming的不同组成部分。

 

离散流

 

离散流(Dstream)是一个连续的数据流。对于离散流,其数据流可以直接从数据源接收,也可以在对原始数据进行一些处理后接收。

 

构建流应用程序的第一步是定义要从中收集数据的数据资源的批处理持续时间。如果批处理持续时间为2秒,则将每2秒收集一次数据并将其存储在RDD中。这些RDD的连续序列链是一个DStream,它是不可变的,可以通过Spark用作一个分布式数据集。

 

 

 

考虑一个典型的数据科学项目。在数据预处理阶段,我们需要转换变量,包括将分类变量转换为数字变量,创建分箱,去除异常值和很多其他的事。Spark保留了在数据上定义的所有转换的历史记录。因此,无论何时发生故障,它都可以追溯转换的路径并重新生成计算结果。

 

我们希望Spark应用程序7 x 24小时持续运行。并且每当故障发生时,我们都希望它能尽快恢复。但是,在大规模处理数据的同时,Spark需要重新计算所有转换以防出现故障。可以想象,这样做的代价可能会非常昂贵。

 

缓存

 

这是应对该挑战的一种方法。我们可以暂时存储已计算(缓存)的结果,以维护在数据上定义的转换的结果。这样,当发生故障时,就不必一次又一次地重新计算这些转换。

 

DStreams允许将流数据保留在内存中。当我们要对同一数据执行多种运算时,这很有用。

 

检查点

 

高速缓存在正常使用时非常有用,但是它需要大量内存。并不是每个人都有数百台具有128 GB内存的计算机来缓存所有内容。

 

检查点的概念能够有所帮助。

 

检查点是另一种保留转换后的数据框结果的技术。它将不时地将正在运行的应用程序的状态保存在任何可靠的存储介质(如HDFS)上。但是,它比缓存慢,灵活性也更差。

 

在拥有流数据时可以使用检查点。转换结果取决于先前的转换结果,并且需要保存以供使用。此外,我们还存储检查点元数据信息,例如用于创建流数据的配置以及一系列DStream操作的结果等。

 

 

流数据的共享变量

 

有时候需要为必须在多个集群上执行的Spark应用程序定义诸如map,reduce或filter之类的函数。在函数中使用的变量会被复制到每台机器(集群)中。

 

在这种情况下,每个集群都有一个不同的执行器,我们想要一些可以赋予这些变量之间关系的东西。

 

例如:假设Spark应用程序在100个不同的集群上运行,它们捕获了来自不同国家的人发布的Instagram图片。

 

现在,每个集群的执行者将计算该特定集群上的数据的结果。但是我们需要一些帮助这些集群进行交流的东西,以便获得汇总结果。在Spark中,我们拥有共享变量,这些变量使此问题得以克服。

 

累加器变量

 

用例包括发生错误的次数,空白日志的数量,我们从特定国家收到请求的次数——所有这些都可以使用累加器解决。

 

每个集群上的执行程序将数据发送回驱动程序进程,以更新累加器变量的值。 累加器仅适用于关联和可交换的运算。例如,对求和和求最大值有用,而求平均值不起作用。

 

 

 

广播变量

 

当我们使用位置数据(例如城市名称和邮政编码的映射)时,这些是固定变量,是吧?现在,如果每次在任意集群上的特定转换都需要这种类型的数据,我们不需要向驱动程序发送请求,因为它会太昂贵。

 

相反,可以在每个集群上存储此数据的副本。这些类型的变量称为广播变量。

 

广播变量允许程序员在每台计算机上保留一个只读变量。通常,Spark使用高效的广播算法自动分配广播变量,但是如果有任务需要多个阶段的相同数据,也可以定义它们。

 

 

 

 

使用PySpark对流数据进行情感分析

 

是时候启动你最喜欢的IDE了!让我们在本节中进行编码,并以实践的方式理解流数据。

 

理解问题陈述

 

在本节我们将使用真实数据集。我们的目标是检测推文中的仇恨言论。为了简单起见,如果一条推文包含带有种族主义或性别歧视情绪的言论,我们就认为该推文包含仇恨言论。

 

因此,任务是将种族主义或性别歧视的推文从其他推文中区分出来。我们将使用包含推文和标签的训练样本,其中标签“1”表示推文是种族主义/性别歧视的,标签“0”则表示其他种类。

 

来源:TechCrunch

 

为什么这是一个与主题相关的项目?因为社交媒体平台以评论和状态更新的形式接收庞大的流数据。该项目将帮助我们审核公开发布的内容。

 

设置项目工作流程

 

1. 模型构建:构建逻辑回归模型管道,对推文中是否包含仇恨言论进行分类。在这里,我们的重点不是建立一个完全准确的分类模型,而是了解如何在流数据上使用任意模型并返回结果

2. 初始化Spark Streaming的环境:一旦模型构建完成,需要定义获取流数据的主机名和端口号

3. 流数据:接下来,从定义的端口添加来自netcat服务器的推文,SparkStreaming API将在指定的持续时间后接收数据

4. 预测并返回结果:一旦接收到推文,就将数据传递到创建的机器学习管道中,并从模型中返回预测的情绪

 

这是对工作流程的简洁说明:

 

 

 

训练数据以建立逻辑回归模型

 

我们在一个CSV文件中存储推文数据及其相应的标签。使用逻辑回归模型来预测推文是否包含仇恨言论。如果是,则模型预测标签为1(否则为0)。你可以参考“面向初学者的PySpark”来设置Spark环境。

 

可以在这里下载数据集和代码。

 

首先,需要定义CSV文件的模式。否则,Spark会将每列数据的类型都视为字符串。读取数据并检查模式是否符合定义:

 

  1. # importing required libraries
  2.  
  3. from pyspark import SparkContext
  4.  
  5. from pyspark.sql.session import SparkSession
  6.  
  7. from pyspark.streaming import StreamingContext
  8.  
  9. import pyspark.sql.types as tp
  10.  
  11. from pyspark.ml import Pipeline
  12.  
  13. from pyspark.ml.feature import StringIndexer, OneHotEncoderEstimator, VectorAssembler
  14.  
  15. from pyspark.ml.feature import StopWordsRemover, Word2Vec, RegexTokenizer
  16.  
  17. from pyspark.ml.classification import LogisticRegression
  18.  
  19. from pyspark.sql import Row
  20.  
  21. # initializing spark session
  22.  
  23. sc = SparkContext(appName="PySparkShell")
  24.  
  25. spark = SparkSession(sc)
  26.  
  27. # define the schema
  28.  
  29. my_schema = tp.StructType([
  30.  
  31. tp.StructField(name='id', dataType= tp.IntegerType(), nullable=True),
  32.  
  33. tp.StructField(name='label', dataType= tp.IntegerType(), nullable=True),
  34.  
  35. tp.StructField(name='tweet', dataType= tp.StringType(), nullable=True)
  36.  
  37. ])
  38.  
  39. # read the dataset
  40.  
  41. my_data = spark.read.csv('twitter_sentiments.csv',
  42.  
  43. schema=my_schema,
  44.  
  45. header=True)
  46.  
  47. # view the data
  48.  
  49. my_data.show(5)
  50.  
  51. # print the schema of the file
  52.  
  53. my_data.printSchema()

 

 

定义机器学习管道的各个阶段

 

现在已经将数据保存在Spark数据框中,需要定义转换数据的不同阶段,然后使用它从模型中获取预测的标签。

 

在第一阶段,使用RegexTokenizer将推特文本转换为单词列表。然后,从单词列表中删除停用词并创建词向量。在最后阶段,使用这些词向量来构建逻辑回归模型并获得预测的情绪。

 

记住——重点不是建立一个完全准确的分类模型,而是要看看如何在流数据上使用预测模型来获取结果。

 

 

  1. # define stage 1: tokenize the tweet text
  2.  
  3. stage_1 = RegexTokenizer(inputCol='tweet' , outputCol='tokens', pattern='\\W')
  4.  
  5. # define stage 2: remove the stop words
  6.  
  7. stage_2 = StopWordsRemover(inputCol='tokens', outputCol='filtered_words')
  8.  
  9. # define stage 3: create a word vector of the size 100
  10.  
  11. stage_3 = Word2Vec(inputCol='filtered_words', outputCol='vector', vectorSize=100)
  12.  
  13. # define stage 4: Logistic Regression Model
  14.  
  15. model = LogisticRegression(featuresCol='vector', labelCol='label')

设置机器学习管道

 

让我们在Pipeline对象中添加阶段,然后按顺序执行这些转换。用训练数据集拟合管道,现在,每当有了新的推文,只需要将其传递给管道对象并转换数据即可获取预测:

 

  1. # setup the pipeline
  2.  
  3. pipeline = Pipeline(stages= [stage_1, stage_2, stage_3, model])
  4.  
  5. # fit the pipeline model with the training data
  6.  
  7. pipelineFit = pipeline.fit(my_data)

流数据和返回结果

 

假设每秒收到数百条评论,我们希望通过阻止用户发布仇恨言论来保持平台整洁。因此,每当我们收到新文本,都会将其传递到管道中并获得预测的情绪。

 

我们将定义一个函数get_prediction,该函数将删除空白句子并创建一个数据框,其中每一行都包含一条推文。

 

初始化Spark Streaming的环境并定义3秒的批处理持续时间。这意味着我们将对每3秒收到的数据进行预测:

  1. # define a function to compute sentiments of the received tweets
  2.  
  3. defget_prediction(tweet_text):
  4.  
  5. try:
  6.  
  7. # filter the tweets whose length is greater than 0
  8.  
  9. tweet_text = tweet_text.filter(lambda x: len(x) >0)
  10.  
  11. # create a dataframe with column name 'tweet' and each row will contain the tweet
  12.  
  13. rowRdd = tweet_text.map(lambda w: Row(tweet=w))
  14.  
  15. # create a spark dataframe
  16.  
  17. wordsDataFrame = spark.createDataFrame(rowRdd)
  18.  
  19. # transform the data using the pipeline and get the predicted sentiment
  20.  
  21. pipelineFit.transform(wordsDataFrame).select('tweet','prediction').show()
  22.  
  23. except :
  24.  
  25. print('No data')
  26.  
  27. # initialize the streaming context
  28.  
  29. ssc = StreamingContext(sc, batchDuration=3)
  30.  
  31. # Create a DStream that will connect to hostname:port, like localhost:9991
  32.  
  33. lines = ssc.socketTextStream(sys.argv[1], int(sys.argv[2]))
  34.  
  35. # split the tweet text by a keyword 'TWEET_APP' so that we can identify which set of words is from a single tweet
  36.  
  37. words = lines.flatMap(lambda line : line.split('TWEET_APP'))
  38.  
  39. # get the predicted sentiments for the tweets received
  40.  
  41. words.foreachRDD(get_prediction)
  42.  
  43. # Start the computation
  44.  
  45. ssc.start()
  46.  
  47. # Wait for the computation to terminate
  48.  
  49. ssc.awaitTermination()

在一个终端上运行该程序,然后使用Netcat(用于将数据发送到定义的主机名和端口号的实用工具)。你可以使用以下命令启动TCP连接: 

  1. nc -lk port_number

 

最后,在第二个终端中键入文本,你将在另一个终端中实时获得预测。

 

完美!

 

 

结语

流数据在未来几年只会越来越热门,因此应该真正开始熟悉这一主题。请记住,数据科学不只是建立模型——整个流程都需要关注。

 

本文介绍了SparkStreaming的基础知识以及如何在真实的数据集上实现它。我鼓励大家使用另一个数据集或抓取实时数据来实现刚刚介绍的内容(你也可以尝试其他模型)。

 

期待在下面的评论区听取你对本文的反馈以及想法。

 

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

没有更多推荐了,返回首页