当前位置:   article > 正文

机器学习常用算法之分类问题_机器学习算法用于分类问题

机器学习算法用于分类问题

一、简单分类器(线性分类)

原理示意:

输入    输出
3   1      0
2   5      1
1   8      1
6   4      0
5   2      0
3   5      1
4   7      1
4  -1     0
7   5      ?->0

  1. import numpy as np
  2. import matplotlib.pyplot as mp
  3. x = np.array([
  4. [3, 1],
  5. [2, 5],
  6. [1, 8],
  7. [6, 4],
  8. [5, 2],
  9. [3, 5],
  10. [4, 7],
  11. [4, -1]])
  12. y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
  13. l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.05
  14. b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.05
  15. grid_x = np.meshgrid(np.arange(l, r, h),
  16. np.arange(b, t, v))
  17. flat_x = np.c_[grid_x[0].ravel(),
  18. grid_x[1].ravel()]
  19. flat_y = np.zeros(len(flat_x), dtype=int)
  20. flat_y[flat_x[:, 0] < flat_x[:, 1]] = 1
  21. grid_y = flat_y.reshape(grid_x[0].shape)
  22. mp.figure('Simple Classification', facecolor='lightgray')
  23. mp.title('Simple Classification', fontsize=20)
  24. mp.xlabel('x', fontsize=14)
  25. mp.ylabel('y', fontsize=14)
  26. mp.tick_params(labelsize=10)
  27. mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray')
  28. mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=60)
  29. mp.show()

二、逻辑分类(线性分类+非线性函数)

2.1 预测函数
x1 x2 -> y
              1
y = -----------
       1 + e^-z
z = k1x1 + k2x2 + b

2.2 成本函数(损失函数)
交叉熵误差
J(k1,k2,b) = sigma(-ylog(y')-(1-y)log(1-y'))/n +m
            # n 为样本总数;m 为正则函数(||k1,k2,b||)x正则强度(惩罚系数)
            # -ylog(y`)-(1-y)log(1-y`) 为交叉熵函数
                 当y=0时,第一项为0,交叉熵函数值趋向于0;
                 当y=1时,第一项为0,交叉熵函数值趋向于无穷大
x x -> 0.9 1
x x -> 0.2 0

  1. sklearn.linear_model.LogisticRegression(
  2.     solver='liblinear', C=正则强度(惩罚系数))

2.3 多元分类
                  A   B    C
... -> A 1 0.9 0.1 0.3 A
... -> B 0 0.3 0.6 0.4 B
... -> C 0 0.1 0.2 0.6 C

2.4 示例

  1. import numpy as np
  2. import sklearn.linear_model as lm
  3. import matplotlib.pyplot as mp
  4. x = np.array([
  5. [4, 7],
  6. [3.5, 8],
  7. [3.1, 6.2],
  8. [0.5, 1],
  9. [1, 2],
  10. [1.2, 1.9],
  11. [6, 2],
  12. [5.7, 1.5],
  13. [5.4, 2.2]])
  14. y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
  15. model = lm.LogisticRegression(solver='liblinear',
  16. C=1000)
  17. model.fit(x, y)
  18. # 绘图区域(限定范围)
  19. l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
  20. b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
  21. grid_x = np.meshgrid(np.arange(l, r, h),
  22. np.arange(b, t, v))
  23. flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
  24. flat_y = model.predict(flat_x)
  25. grid_y = flat_y.reshape(grid_x[0].shape)
  26. mp.figure('Logistic Classification',
  27. facecolor='lightgray')
  28. mp.title('Logistic Classification', fontsize=20)
  29. mp.xlabel('x', fontsize=14)
  30. mp.ylabel('y', fontsize=14)
  31. mp.tick_params(labelsize=10)
  32. mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray')
  33. mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=60)
  34. mp.show()

三、朴素贝叶斯分类

3.1 贝叶斯定理(条件概率)
                    P(A)P(B|A)
      P(A|B) = -----------
                         P(B)

3.2 朴素贝叶斯分类
      求X样本属于C类别的概率
      当观察到X样本出现时,其所属的类别为C的概率:
      P(C|X)=P(C)P(X|C)/P(X)
      P(C)P(X|C) = P(C,X)=P(C,x1,x2,...,xn)
                                       =P(x1,x2,...,xn,C)
                                       =P(x1|x2,...,xn,C)P(x2,...,xn,C)
                                       =P(x1|x2,...,xn,C)P(x2|x3,...,xn,C)P(x3,...,xn,C)
      <朴素>:条件独立假设,即样本各个特征之间并无关联,不构成条件约束。
       P(C|X) = P(x1|C)P(x2|C)P(x3|C)...P(C)
      # P(C,X) 为事件C和X同时发生的概率(联合概率)
==>> X样本属于C类别的概率,正比于C类别的概率乘以C类别条件下X样本中每个特征值出现的概率值乘积。

  1. import numpy as np
  2. import sklearn.naive_bayes as nb
  3. import matplotlib.pyplot as mp
  4. x, y = [], []
  5. with open('../ML/data/multiple1.txt', 'r') as f:
  6. for line in f.readlines():
  7. data = [float(substr) for substr in line.split(',')]
  8. x.append(data[:-1])
  9. y.append(data[-1])
  10. x = np.array(x)
  11. y = np.array(y)
  12. # 创建模型
  13. model = nb.GaussianNB() # 使用高斯(正态分布)分布求概率
  14. model.fit(x, y)
  15. l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
  16. b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
  17. grid_x = np.meshgrid(np.arange(l, r, h),
  18. np.arange(b, t, v))
  19. flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
  20. flat_y = model.predict(flat_x)
  21. grid_y = flat_y.reshape(grid_x[0].shape)
  22. # 绘图
  23. mp.figure('Naive Bayes Classification',
  24. facecolor='lightgray')
  25. mp.title('Naive Bayes Classification', fontsize=20)
  26. mp.xlabel('x', fontsize=14)
  27. mp.ylabel('y', fontsize=14)
  28. mp.tick_params(labelsize=10)
  29. mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray')
  30. mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=60)
  31. mp.show()

3.3 划分训练集和测试集

  1. sklearn.model_selection.train_test_split(
  2.      输入集合,输出集合,test_size=测试集占比,
  3.      random_state=随机种子源)
  4.  
  5. --> 得到:训练输入,测试输入,训练输出,测试输出
  1. import numpy as np
  2. import sklearn.naive_bayes as nb
  3. import matplotlib.pyplot as mp
  4. import sklearn.model_selection as ms
  5. x, y = [], []
  6. with open('../ML/data/multiple1.txt', 'r') as f:
  7. for line in f.readlines():
  8. data = [float(substr) for substr in line.split(',')]
  9. x.append(data[:-1])
  10. y.append(data[-1])
  11. x = np.array(x)
  12. y = np.array(y)
  13. train_x, test_x, train_y, test_y = \
  14. ms.train_test_split(x, y, test_size=0.25,
  15. random_state=7)
  16. # 创建模型
  17. model = nb.GaussianNB() # 使用高斯(正态分布)分布求概率
  18. model.fit(train_x, train_y) # 训练
  19. # 分类边界线
  20. l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
  21. b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
  22. grid_x = np.meshgrid(np.arange(l, r, h),
  23. np.arange(b, t, v))
  24. flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
  25. flat_y = model.predict(flat_x)
  26. grid_y = flat_y.reshape(grid_x[0].shape)
  27. # 测试
  28. pred_test_y = model.predict(test_x)
  29. # 正确率
  30. print((pred_test_y == test_y).sum() /
  31. pred_test_y.size)
  32. # 绘图
  33. mp.figure('Naive Bayes Classification',
  34. facecolor='lightgray')
  35. mp.title('Naive Bayes Classification', fontsize=20)
  36. mp.xlabel('x', fontsize=14)
  37. mp.ylabel('y', fontsize=14)
  38. mp.tick_params(labelsize=10)
  39. mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray')
  40. mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=60)
  41. mp.show()

四、随机森林分类

              森林深入学习请移步:https://www.cnblogs.com/fionacai/p/5894142.html

4.1 超参数取值调优 -- 验证曲线

f1_score = f(模型对象超参数
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/750400
推荐阅读
相关标签
  

闽ICP备14008679号