1. 机器学习案例
2. 理论知识
过拟合和欠拟合
过拟合:模型能够很好的拟合样本,但对新数据的预测准确性很差
欠拟合:模型不能够很好的拟合样本,且对新数据的预测准确性也不好
代价函数
代价函数是代价与模型参数间的函数关系
代价函数记为J(θ),θ代表模型参数
m 是训练样本数 h(x^i) 是模型对每个样本的预测值 y^i 是每个样本真实值
模型准确性
将数据集划分为训练集和测试集
在 scikit-learn 中调用 score(X_test, y_test),计算模型分数(准确性)值
模型优化
如何预防过拟合
- 降低模型复杂度
- 正则化
泛化能力(metric)评估方法
互斥原则
同分布原则
- 获得更多训练数据
- 增加有价值的特征
-
交叉验证数据集
学习曲线
我们可以把 J_train(B)和 J_cν(θ) 作为纵坐标,画出与训练数据集 m 的大小关系,这就是学习曲线。
把数据集分成训练数据集矛和交叉验证数据集
- 取训练数据集的 20%作为训练样本,训练出模型参数。 ·
- 使用交叉验证数据集来计算训练出来的模型的准确性。 ·
- 以训练数据集的准确性,交叉验证的准确性作为纵坐标,训练数据集个数作为横坐 标,在坐标轴上画出上述步骤计算出来的模型准确性。 ·
- 训练数据集增加 10%,跳到步骤 3 继续执行,直到训练数据集大小为 100%为止。
查准率和召回率
| 预测数据/实际数据 | 实际恶性肿瘤 | 实际良性肿瘤 | | —- | —- | —- | | 预测恶性肿瘸 | TruePositive | FalsePositive | | 预测良性肿瘤 | FalseNegative | TrueNegative |
在 scikit-leam 里,评估模型性能的算法都在 sklean.metrics 包里。其中,计算查准率 和召回率的 API 分别为 sklean.metrics.precision score()和l sklean .metrics.recall score()。
F1 Score
其中 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)
- 逻辑回归
Sigmoid Function 与模型输出的概率解释
函数图像
2.3决策边界
2.4代价函数
- 参数应当预测值h尽可能接近y(Classification,Regerssion)
- 衡量预测值接近程度—方差(Squared Error)
- 代价函数的值越小,模型效果越好,它是参数的函数
- 参数变化时,决策边界也跟着变化,从而模型效果也变化而代价函数的值(loss)也变化
参数选择
Training Dataset
Validation Dataset
Testing Dataset
5. 实例
Classification
KNN(k-Nearest Neighbors)
- 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)
<a name="2i6FA"></a>### LogisticRegressionHow it works> coefficients * features + intercept> 参数 * 特征 + 截距```pythonfrom sklearn import datasetsdigits = datasets.load_digits()X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)# Apply logistic regression and print scoreslr = LogisticRegression()lr.fit(X_train, y_train)# 预测精确性print(lr.score(X_train, y_train)) # 训练集的accuracy 0.9970304380103935print(lr.score(X_test, y_test)) # 测试集的accuracy 0.9511111111111111# 预测结果print(lr.predict(X_test)) # 输出预测结果集# [2 3 2]print(lr.predict_proba(X_test)) # 输出属于某标签的概率# [[0.56651809 0.43348191]# [0.15598162 0.84401838]# [0.86852502 0.13147498]]
LinerSVC 多分类
from sklearn import datasetsdigits = datasets.load_digits()X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)# Apply SVM and print scoressvm = SVC()svm.fit(X_train,y_train)print(svm.score(X_train,y_train))print(svm.score(X_test,y_test))# Overfitting1.00.4666666666666667
决策边界
from sklearn.linear_model import LogisticRegressionfrom sklearn.svm import SVC, LinearSVCfrom sklearn.neighbors import KNeighborsClassifier# Define the classifiersclassifiers = [LogisticRegression(), LinearSVC(),SVC(),KNeighborsClassifier()]# Fit the classifiersfor c in classifiers:c.fit(X,y)# Plot the classifiersplot_4_classifiers(X, y, classifiers)plt.show()
