暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DBA的机器学习_入门篇

数据库工作笔记 2020-08-31
227


假定你只听说机器学习,但是从来没用过机器学习

假定对数据及其规律有那么一些敏感(当然,你如果是个DBA就方便多了,不愁没有数据来源)

假定你会一点Python,不要多,会点简单的语法就够。


那么可以试试机器学习了,计划从使用者角度分3-5篇文章说说:机器学习应该怎么用,能解决什么问题?


一.机器学习的概念入门:

注:如果你不想了解这些无趣的概念,可以直接跳到 2.1节看DEMO实战

机器学习的定义:

把计算机想象成一个人,给他一组已有数据,让它去分析总结规律,这个过程就叫机器学习

机器学习的目的/作用:

1.预测:预测一个数值(例如价格或失效时间)订单量预测,人流量预测,价格变化预测,服务器性能变化预测,等等

2.分类/决策:预测某个事物的类别(狗/猫,好/坏,张三/李四)图片识别,各种分类,路径选择,ai智能等

机器学习的方法:

1.监督学习:

线性回归,Logistic回归,CART,朴素贝叶斯,KNN

2.无监督学习:

主成分分析PCA,等距映射、局部线性嵌入、拉普拉斯特征映射、黑塞局部线性嵌入和局部切空间排列等

3.强化学习:

它允许代理根据其当前状态决定最佳的下一个动作,通过学习将最大化奖励的行为。

其中最常用最基础的算法可能就是回归了



二.线性回归算法入门实践

1.线性回归概念:

线性回归(Linear Regression)是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

举例:

披萨尺寸和价格之间的关系 。这是一元线性回归

我习惯用:y=a+bx 来表示

房屋面积,离市中心距离,周边犯罪率,房屋建成年份 等条件与 这个房子的价格之间的规律。这是多元线性回归

可以用y=a+b1x1+b2x2+.....+bnxn 公式来表示



2.线性回归实战Demo

2.1 准备工作

首先我们有一组房屋面积和房价的对应的数据:fangdata.csv ,里面内容是这样的

      面积(平米)      总价(万)
0 32.502345 31.707006
1 53.426804 68.777596
2 61.530358 62.562382
3 47.475640 71.546632
4 59.813208 87.230925
.. ... ...
95 50.030174 81.536991
96 49.239765 72.111832
97 50.039576 85.232007
98 48.149859 66.224958
99 25.128485 53.454394

这个csv我们称这为:训练样本

有了训练样本后,我们要明白我们这次行动的目标:让机器学习帮我们总结出这些样本的规律,就是从样本中训练出一个:模型

为了对模型预测做个评价,我们需要一个函数来评估这个模型,称之为:代价函数


2.2 原理和代码实现

注:这一节的目的是为了知其所以然,会很长,如果你不想关注其原理可以选择跳过

针对这个样本,我们画个图来演示下数据分布 :

    import numpy as np
    import pandas as pd
    from matplotlib import pyplot as plt


    data = np.loadtxt('fangdata.csv',delimiter=",",dtype=np.float64)
    df = pd.DataFrame(data, columns=['面积(平米)', '总价(万)'])
    x = data[:,0]
    y = data[:,1]
    plt.figure(figsize=(15,6))
    plt.scatter(x,y)
    plt.show()

    得到一个散点图


    这里我们要得到一条直线来预测 房屋面积和总价之间的关系。

    我们用:y=a+bx 就可以画出对应的各种各样的线

    肉眼会发现 a=0;b=0.4左右 的斜线基本符合要求

    那计算机怎么发现这个a,b值 。来达到最好的一条斜线来预测(给定一个面积,得到这个房子的销售总价)

    这里要用到一个代价函数:1.假定我们随便画一条直线 2.我们用图上的每个点去和这条假定的直线x轴对齐 y值相减的平方(平方可以去掉正负) 来描述这个预测线和真实的偏差了多少 3.所有的点和假定直线的偏差。我们叫它代价

    我们每画一条直线都去算一下这个代价

    下面是代价函数

      def compute_cost(a, b, data):
      total_cost = 0
      N = float(len(data))


      for i in range(0, len(data)):
      x = data[i, 0]
      y = data[i, 1]
      total_cost += (y - (b * x + a)) ** 2
      return total_cost/N

      假如我们是计算机,而且是个很笨的计算机,我们给a,b尝试几个值 ,然后每个值画一条直线都去算一下这个代价。

        test=[
        (0,0.5,'b-.'),
        (0,0.1,'y-.'),
        (100,0.5,'y.'),
        (100,-0.5,'b.'),
        (5,1.2,'r')
        ]




        plt.figure(figsize=(15,6))
        plt.scatter(x, y)
        for (a,b,color) in test:
        pred = b * x + a
        title='y=%s+%sx (cost=%s)'%(a,b,compute_cost(a,b,data))
        plt.plot(x, pred, color,label=title)
        plt.legend()
        plt.show()


        我们用最笨的方法尝试了5种a,b值 ,也会发现红色的更适合这些点的预测线(cost代价最小)。

        重温一下我们的目的:画一个y=a+bx 直线,目标是a,b这条直线尽可能的贴合图上的这些点

        有了代价函数,我们从一个起点来计算它的a,b取值如何变动。可以使代价函数的取值更小 这里我们从a=0,b=0,每次变化0.01个步长开始

        当然,机器比我们勤快,它可以瞬间列举出几万,几亿个预测模型出来,然后它需要按一个梯度来使COST越来越小,直到找到最优解。

        所以我们需要:梯度下降算法:

          def step_gradient(a_current, b_current, data, learning_rate):
          a_gradient = 0
          b_gradient = 0
          N = float(len(data))


          #Calculate Gradient
          for i in range(0, len(data)):
          x = data[i, 0]
          y = data[i, 1]
          b_gradient += - (2/N) * x * (y - (b_current * x + a_current))
          a_gradient += - (2/N) * (y - (b_current * x + a_current))


          #Update current m and b
          b_updated = b_current - learning_rate * b_gradient
          a_updated = a_current - learning_rate * a_gradient


          #Return updated parameters
          return a_updated, b_updated


          def gradient_descent_runner(data, starting_a, starting_b, learning_rate, num_iterations):
          a = starting_a
          b = starting_b
          cost_graph = []


          #For every iteration, optimize b, m and compute its cost
          for i in range(num_iterations):
          cost_graph.append(compute_cost(a, b, data))
          a,b = step_gradient(a, b, data, learning_rate)


          return [a, b, cost_graph]


          这里引用一幅图来说明机器学习是如何用梯度下降一点点的找到这个y(房价)和x(房屋面积)之间的关系的



          具体我们这个Demo:x是房屋面积,y是价格,我们要找到这样一条直线,使每个蓝色的点到红线的距离之和最小

            begin_a=0
            begin_b=0


            learning_rate = 0.0001
            num_iterations = 1000
             #注意这两个参数取值 ,不能太大,也不能太小。
             #可以理解为:一个步长,一个最大步数的意思


            plt.figure(figsize=(15,6))
            plt.scatter(x, y)
            pred = b * x + a
            plt.plot(x, pred, c='r')
            plt.title('Best y=a+bx (a=%s,b=%s)'%(a,b))
            plt.show()




            我们找到了这个关系,建立了这个模型,现在来预测:2000,3000,4000,5000 平米的房子应该卖多少钱

              for p in (2000,3000,4000,5000):
              print("%s平米的房子,预计销售价格为:%s"%(p,p*b+a))
              2000平米的房子,预计销售价格为:2955.577106898827
              3000平米的房子,预计销售价格为:4433.321192088271
              4000平米的房子,预计销售价格为:5911.065277277717

              5000平米的房子,预计销售价格为:7388.809362467161


              我们还要对我们的模型做一个评估(这个算法和模型准不准,好不好用):



                print (('Optimized a:', a))
                print (('Optimized b:', b))
                print (('Minimized cost:', compute_cost(a, b, data)))
                ('Optimized a:', 0.08893651993741346)
                ('Optimized b:', 1.4777440851894448)
                ('Minimized cost:', 112.61481011613473)



                /*---------------

                在这里,如果你对2.2节的原理和代码实现不感兴趣(事实上我写得很粗糙,没有很细的说为什么要那样写函数,为什么那个梯度就可以下降,可能也需要你自己想一下

                可以直接跳到这里来。

                ---------------*/

                2.3 Demo实战

                经常有人这样形容找工作:面试造核弹,工作拧螺丝。

                除掉这些枯燥的数学公式和原理实现,现实中大家用机器学习的时候需要去写这些公式,拼这些算法吗?

                现实是90%的业务都不会自己去“创造算法”,一般都是直接用现成的库(sklearn、pytorch、tensorflow)

                例如:真正解决这个房价预测的时候,我们只需要三步:

                  import numpy as np
                  from sklearn import linear_model


                  #1.加载数据
                  data = np.loadtxt('fangdata.csv',delimiter=",",dtype=np.float64)
                  x = data[:,0]
                  y = data[:,1]
                  x = x.reshape(-1, 1)


                  #2.训练模型
                  model = linear_model.LinearRegression()
                  model.fit(x, y)


                  #3.保存模型
                  with open('./lr_fang.pkl', 'wb') as f:
                  pickle.dump(model, f)
                  print('模型保存成功!')

                  完成以上的三步以后,我们就得到了一个模型

                  现在我们用这个模型来预测:2000,3000,4000,5000 平米的房子应该卖多少钱,只需要这样

                    with open('./lr_fang.pkl', 'rb') as f:
                    model = pickle.load(f)
                    house_p=[[2000],[3000],[4000],[5000]]
                    a = model.predict(house_p)
                    for i in range(len(house_p)):
                    print("%s平米的房子,预计销售价格为:%s"%(house_p[i][0],a[i]))

                    得到结果:

                    2000平米的房子,预计销售价格为:2652.85306649299
                    3000平米的房子,预计销售价格为:3975.2840892483496
                    4000平米的房子,预计销售价格为:5297.715112003709
                    5000平米的房子,预计销售价格为:6620.146134759068


                    是不是很简单,是不是一不小心就踏入了机器学习的大门了。



                    下一篇将把这个房价问题复杂化,考虑更多的影响因素。


                    如果你手头有《python机器学习和算法》赵志勇 这本书,那就更好了,我也在看




                    文章转载自数据库工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论