人从过去经验中学习;
机器从过往数据中学习。
- 回归模型是一个预测值的模型
- 分类返回的是状态
1.机器学习领域的一些最重要的分类算法,包括以下算法:
- 逻辑回归 Logistic Regression
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
- 神经网络
from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier()
- 决策树 Decision Trees
from sklearn.ensemble import GradientBoostingClassifier
classifier = GradientBoostingClassifier()
- 支持向量机 Support Vector Machines
from sklearn.svm import SVC
classifier = SVC()
例如,这样的一组数组,使用不同的分类器,就得到不同的分类效果:
通过逻辑回归分类器,我们得到:
通过决策树分类器,我们得到:
通过SVM分类器,我们得到:
过拟合 OverFitting
当过度复杂化问题时,我们称之为过拟合
例如:用火箭筒杀死苍蝇
过拟合特点是:
- 在训练集时,表现良好,它趋向记住内容,而不是学习内容
- 在测试集时,表示不好
- 泛化能力差
这是因为方差引起的误差
欠拟合 UnderFitting
当过度简化问题时,就是称之为欠拟合
例如:用苍蝇拍来杀死哥斯拉龙
欠拟合特点是:
- 高方差
网格搜索 Grid Search
网格搜索,就是制作一个表格列出所有可能的组合,然后选出最佳的组合。
交叉验证用来挑选最佳组合,最后用测试集检测该模型效果是否很好。
2.K 折交叉验证
K 折交叉验证,就是K次的交叉验证;交叉验证,就是主要应用在建模中,在给定的建模样本中,拿出大部分用于建模,一小部分用于刚建立的建模进行预测误差,并记录它们的平均加和。【这是百度百科的定义】
交叉验证,是用来分离测试集和训练集的,然后用测试集来检测训练模型的结果的还坏。查看StackOverflow解释
在 K 折交叉验证中,
- 1.我们将数据分成K个包
- 2.然后我们将模型训练K次
- 3.每次将不同的包作为测试集,而剩下的作为训练集
- 4.然后我们求结果的平均值,来得到最终模型
在 sklearn 中
from sklearn.model_selection import KFold
# 数据大小为12,测试大小为3
# 为了保证数据无偏差,我需要将数据打乱,就使用shuffle参数
kf = KFold(12, 3, shuffle=True)
for train_indices, test_indices in kf:
print train_indices, test_indices
3.学习曲线 learn_curve
我们可以通过学习曲线来检测模型是欠拟合
,过拟合
还是刚刚好
。
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
estimator
,是我们针对数据使用的实际分类器,例如LogisticRegression()
或GradientBoostingClassifier()
。- X 和 y 是我们的数据,分别表示特征和标签。
train_sizes
是用来在曲线上绘制每个点的数据大小。train_scores
是针对每组数据进行训练后的算法训练得分。test_scores
是针对每组数据进行训练后的算法测试得分。
完整的测试代码,在这里
结果是
我们可以根据这些曲线得出结论:
对数几率回归
模型的训练和测试得分很低。决策树
模型的训练和测试得分很高。支持向量机
模型的训练得分很高,测试得分很低。
由此可以判断,逻辑回归模型欠拟合,支持向量机模型过拟合,决策树正常
。
4.评估指标
用哪些指标来评估一个模型的好坏
混淆矩阵
诊断患者
是否患病的例子
来说明:
- True Positive
: 当就诊者患病,模型正确诊断为患病时
- True Negative
: 当就诊者是健康的,模型正确诊断为健康时
- False Negative
: 当就诊者患病,模型错误诊断为健康时
- False Positive
: 当就诊者是健康的,模型错误诊断为患病时
检测邮件
是否为垃圾邮件
的例子:
- True Positive
: 当收到垃圾邮件,模型正确分类它为垃圾邮件
- True Negative
: 当收到正常邮件时,模型正确分类它为正常邮件
- False Negative
: 当收到垃圾邮件时,模型错误的分类它为正常邮件
- False Positive
: 当收到正常邮件时,模型错误的分类它为垃圾邮件
精确率
衡量模型性能的一种方式
精度 Precision
精度的计算公式:True Positive / (True Positive + False Positive)
对于这道题就是:6 / (6 + 2) = 75%
召回率 Recall
召回率的计算公式:True Positive / (True Positive + False Negative)
对于这道题就是:6 / (6 + 1) = 85.71%
F1 得分 (调和平均数)Hormonic Mean
公式为:F1 Score = 2 * ((Precision * Recall) / (Precision + Recall))
例如:
如果医疗模型的精度 55.6%,召回率是 83.3%,那么 F1 得分是多少?(答案请填写百分比,并四舍五入到小数点后一位。)
公式拆解:
0.556 * 0.833 = 0.463148
0.556 * 0.833 = 1.389
0.463148 / 1.389 = 0.3334
2 * 0.3334 = 0.6668
最后结果为:66.68%
ROC 曲线 (Receiver Operating Characteristic)
亦称作:受试者工作特征曲线
ROC 曲线评估模型的技巧
True Positive Rate = True Positives / All Positives
False Positive Rate = True Positives / All Positives
根据上面的真阳性率和假阳性率得出以下曲线,值越接近1,效果越好。
回归指标
评估回归模型的指标
Mean Absolute Error 平均绝对误差
Mean Squared Error 均方差
此度量,是添加点和线之间的距离的平方
R2 分值(R2 Score)
R2 分数接近1,模型就不错;如果接近0,就基本相当于用点的平均值来猜测。
方差 Variance
方差描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散。
偏差 Bias
偏差描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据
项目练习
【1.构建垃圾邮件分类器】
- 第 0 步: 朴素贝叶斯定理简介
- 第 1.1 步: 了解我们的数据集
- 第 1.2 步: 数据预处理
- 第 2.1 步: Bag of Words(BoW)
- 第 2.2 步: 从头实现 BoW
- 第 2.3 步: 在 scikit-learn 中实现 Bag of Words
- 第 3.1 步: 训练和测试数据集
- 第 3.2 步: 向我们的数据集中应用 Bag of Words 处理流程
- 第 4.1 步: 从头实现贝叶斯定理
- 第 4.2 步: 从头实现朴素贝叶斯定理
- 第 5 步: 使用 scikit-learn 实现朴素贝叶斯定理
- 第 6 步: 评估模型
- 第 7 步: 结论
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cross_validation import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, r2_score
# 1.加载数据
df = pd.read_table('smsspamcollection/SMSSpamCollection', names=['label', 'sms_message'])
# 对label进行二分类,垃圾邮件是1,正常邮件是0
df['label'] = df.label.map({ 'ham' : 0 , 'spam' : 1 })
# 2.分割数据到train和test
X_train, X_test, y_train, y_test = train_test_split(df['sms_message'],
df['label'],
random_state=1)
print('Number of rows in the total set: {}'.format(df.shape[0]))
print('Number of rows in the training set: {}'.format(X_train.shape[0]))
print('Number of rows in the test set: {}'.format(X_test.shape[0]))
# 3.对word统计出现的个数
count_vector = CountVectorizer()
training_data = count_vector.fit_transform(X_train)
testing_data = count_vector.transform(X_test)
# 4.通过朴素贝叶斯算法来预测
naive_bayes = MultinomialNB()
naive_bayes.fit(training_data, y_train)
predictions = naive_bayes.predict(testing_data)
# 5.衡量预测值的指标
print('Accuracy score: ', format(accuracy_score(predictions, y_test)))
print('Precision score: ', format(precision_score(predictions, y_test)))
print('Recall score: ', format(recall_score(predictions, y_test)))
print('F1 score: ', format(f1_score(predictions, y_test)))
print('R2 score: ', format(r2_score(predictions, y_test)))
【2.波士顿房价预测】
在此项目中,我们将对为马萨诸塞州波士顿地区的房屋价格收集的数据应用基本机器学习概念,以预测新房屋的销售价格。您首先将探索这些数据以获取数据集的重要特征和描述性统计信息。接下来,您要正确地将数据拆分为测试数据集和训练数据集,并确定适用于此问题的性能指标。然后,您将使用不同的参数和训练集大小分析学习算法的性能图表。这让您能够挑选最好地泛化到未见过的数据的最佳模型。最后,您将根据一个新样本测试此最佳模型并将预测的销售价格与您的统计数据进行比较。
通过完成此项目您将会学习(并最终知道)以下知识:
- 如何使用 NumPy 调查数据集的潜在特征。
- 如何分析各种学习性能图以了解方差和偏差。
- 如何确定用于从未看见的数据进行预测的最佳猜测模型。
- 如何评估模型使用之前的数据处理未看见数据的表现。
import pandas as pd
from sklearn.model_selection import KFold, train_test_split, GridSearchCV
from sklearn.metrics import r2_score, make_scorer
from sklearn.tree import DecisionTreeRegressor
bj_df = pd.read_csv('bj_housing.csv')
# 1.获取房屋价格标签,和房屋特征
labels = bj_df['Value']
features = bj_df.drop(columns=['Value'])
# 2.分割数据
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2)
def performance_metric(y_true, y_pred):
score = r2_score(y_true, y_pred)
return score
# 3.获得最佳模型
def fit_model(X, y):
regressor = DecisionTreeRegressor()
parameters = { 'max_depth' : [1, 3, 4, 6, 8, 10] }
score_fnc = make_scorer(performance_metric)
cross_validator = KFold(n_splits=5)
grid = GridSearchCV(regressor, parameters, score_fnc, cv=cross_validator)
grid.fit(X, y)
return grid.best_estimator_
optimal_regressor = fit_model(X_train, y_train)
print("The optimal Model is {}".format(optimal_regressor.get_params()['max_depth']))
# 4.预测
predicted_price = optimal_regressor.predict(X_test)
# 5.衡量模型的得分
got_score = performance_metric(y_test, predicted_price)
print("最终得分:{}".format(got_score))