深度学习 之二 【机器学习介绍】

人从过去经验中学习;
机器从过往数据中学习。

  • 回归模型是一个预测值的模型
  • 分类返回的是状态

1.机器学习领域的一些最重要的分类算法,包括以下算法:

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
  • 神经网络
from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier()
from sklearn.ensemble import GradientBoostingClassifier
classifier = GradientBoostingClassifier()
from sklearn.svm import SVC
classifier = SVC()

例如,这样的一组数组,使用不同的分类器,就得到不同的分类效果:
这里写图片描述

通过逻辑回归分类器,我们得到:
这里写图片描述

通过决策树分类器,我们得到:
这里写图片描述

通过SVM分类器,我们得到:
这里写图片描述

过拟合 OverFitting

当过度复杂化问题时,我们称之为过拟合
例如:用火箭筒杀死苍蝇

过拟合特点是:
- 在训练集时,表现良好,它趋向记住内容,而不是学习内容
- 在测试集时,表示不好
- 泛化能力差
这是因为方差引起的误差

欠拟合 UnderFitting

当过度简化问题时,就是称之为欠拟合
例如:用苍蝇拍来杀死哥斯拉龙

欠拟合特点是:
- 高方差

网格搜索,就是制作一个表格列出所有可能的组合,然后选出最佳的组合。
交叉验证用来挑选最佳组合,最后用测试集检测该模型效果是否很好。

这里写图片描述

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值