1. 机器学习案例

360截图18750818052535.png

2. 理论知识

过拟合和欠拟合

过拟合:模型能够很好的拟合样本,但对新数据的预测准确性很差
欠拟合:模型不能够很好的拟合样本,且对新数据的预测准确性也不好

代价函数

代价函数是代价模型参数间的函数关系
代价函数记为J(θ),θ代表模型参数
机器学习 - 图2

m 是训练样本数 h(x^i) 是模型对每个样本的预测值 y^i 是每个样本真实值

模型准确性

将数据集划分为训练集测试集
机器学习 - 图3
在 scikit-learn 中调用 score(X_test, y_test),计算模型分数(准确性)值

模型优化

如何预防过拟合

  1. 降低模型复杂度
    1. 正则化

泛化能力(metric)评估方法
互斥原则
同分布原则

  1. 获得更多训练数据
  2. 增加有价值的特征
  3. 增加多项式特征

    交叉验证数据集

    学习曲线

    我们可以把 J_train(B)和 J_cν(θ) 作为纵坐标,画出与训练数据集 m 的大小关系,这就是学习曲线。

  4. 把数据集分成训练数据集矛和交叉验证数据集

  5. 取训练数据集的 20%作为训练样本,训练出模型参数。 ·
  6. 使用交叉验证数据集来计算训练出来的模型的准确性。 ·
  7. 以训练数据集的准确性,交叉验证的准确性作为纵坐标,训练数据集个数作为横坐 标,在坐标轴上画出上述步骤计算出来的模型准确性。 ·
  8. 训练数据集增加 10%,跳到步骤 3 继续执行,直到训练数据集大小为 100%为止。

    查准率和召回率

    | 预测数据/实际数据 | 实际恶性肿瘤 | 实际良性肿瘤 | | —- | —- | —- | | 预测恶性肿瘸 | TruePositive | FalsePositive | | 预测良性肿瘤 | FalseNegative | TrueNegative |

机器学习 - 图4
机器学习 - 图5

在 scikit-leam 里,评估模型性能的算法都在 sklean.metrics 包里。其中,计算查准率 和召回率的 API 分别为 sklean.metrics.precision score()和l sklean .metrics.recall score()。

F1 Score

机器学习 - 图6
其中 P 是查准率, R 是召回率。这样就可以用一个数值直接判断哪个算法性能更好。
典型地,如果查准率或召回率有一个为 0,那么 F1Score 将会为 0。而理想的情况下,查准 率和召回率都为 l , 则算出来的 F1Score 为 1
在 scikit-learn 里,计算 (F1 Score) 的函数是 sklean.metrics.fl_ score()。

3. 机器学习分类

2.1 有监督学习

2.1.1 Regression(labels are continuous)

2.1.2 Classificaiton(labels are categorical)

  1. 逻辑回归

Sigmoid Function 与模型输出的概率解释
机器学习 - 图7
函数图像
v2-ab82d755dba95f0585678fe2d4af28d6_r.jpg

2.3决策边界

通过学习θ,得到一个能够将数据集划分的边界

2.4代价函数

  • 参数应当预测值h尽可能接近y(Classification,Regerssion)
  • 衡量预测值接近程度—方差(Squared Error)
  • 代价函数的值越小,模型效果越好,它是参数的函数
  • 参数变化时,决策边界也跟着变化,从而模型效果也变化而代价函数的值(loss)也变化

参数选择

Training Dataset
Validation Dataset
Testing Dataset

5. 实例

Classification

KNN(k-Nearest Neighbors)

  1. Fit and Predict ```python from sklearn.neighbors import KNeighborsClassifier

Create and fit the model

knn_w = KNeighborsClassifier(n_neighbors=17,weights=’distance’)

result_knn_w = knn_w.fit(train_X,train_y)

train_score = result_knn_w.score(train_X,train_y)

test_score = result_knn_w.score(test_X,test_y)

print(“train score:{};test score:{}”.format(train_score,test_score))

Predict on the test features, print the results

pred = knn.predict(X_test)[0] # 预测测试集的第一个数据 print(“Prediction for test example 0:”, pred)

  1. <a name="2i6FA"></a>
  2. ### LogisticRegression
  3. How it works
  4. > coefficients * features + intercept
  5. > 参数 * 特征 + 截距
  6. ```python
  7. from sklearn import datasets
  8. digits = datasets.load_digits()
  9. X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)
  10. # Apply logistic regression and print scores
  11. lr = LogisticRegression()
  12. lr.fit(X_train, y_train)
  13. # 预测精确性
  14. print(lr.score(X_train, y_train)) # 训练集的accuracy 0.9970304380103935
  15. print(lr.score(X_test, y_test)) # 测试集的accuracy 0.9511111111111111
  16. # 预测结果
  17. print(lr.predict(X_test)) # 输出预测结果集
  18. # [2 3 2]
  19. print(lr.predict_proba(X_test)) # 输出属于某标签的概率
  20. # [[0.56651809 0.43348191]
  21. # [0.15598162 0.84401838]
  22. # [0.86852502 0.13147498]]

LinerSVC 多分类

  1. from sklearn import datasets
  2. digits = datasets.load_digits()
  3. X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)
  4. # Apply SVM and print scores
  5. svm = SVC()
  6. svm.fit(X_train,y_train)
  7. print(svm.score(X_train,y_train))
  8. print(svm.score(X_test,y_test))
  9. # Overfitting
  10. 1.0
  11. 0.4666666666666667

决策边界

  1. from sklearn.linear_model import LogisticRegression
  2. from sklearn.svm import SVC, LinearSVC
  3. from sklearn.neighbors import KNeighborsClassifier
  4. # Define the classifiers
  5. classifiers = [LogisticRegression(), LinearSVC(),SVC(),KNeighborsClassifier()]
  6. # Fit the classifiers
  7. for c in classifiers:
  8. c.fit(X,y)
  9. # Plot the classifiers
  10. plot_4_classifiers(X, y, classifiers)
  11. plt.show()

image.svg