TowardsDataScience 博客中文翻译 2016~2018(一百九十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

糖尿病的机器学习

原文:https://towardsdatascience.com/machine-learning-for-diabetes-562dd7df4d42?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo credit: Pixabay

根据疾病控制和预防中心的数据,现在大约七分之一的美国成年人患有糖尿病。但到 2050 年,这一比例可能会飙升至三分之一。考虑到这一点,这就是我们今天要做的事情:学习如何使用机器学习来帮助我们预测糖尿病。我们开始吧!

数据

糖尿病数据集源自 UCI 机器学习库,可以从这里下载。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlinediabetes = pd.read_csv('diabetes.csv')
print(diabetes.columns)

指数([‘妊娠’,‘血糖’,‘血压’,‘皮肤厚度’,‘胰岛素’,‘身体质量指数’,‘糖尿病血糖’,‘年龄’,‘结果’],dtype= ‘对象’)

diabetes.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1

糖尿病数据集由 768 个数据点组成,每个数据点有 9 个特征:

print("dimension of diabetes data: {}".format(diabetes.shape))

糖尿病数据的维度:(768,9)

“结局”是我们要预测的特征,0 表示没有糖尿病,1 表示有糖尿病。在这 768 个数据点中,500 个被标记为 0,268 个被标记为 1:

print(diabetes.groupby('Outcome').size())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2

import seaborn as snssns.countplot(diabetes['Outcome'],label="Count")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3

diabetes.info()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4

k-最近邻

k-NN 算法可以说是最简单的机器学习算法。构建模型仅包括存储训练数据集。为了对新的数据点进行预测,该算法会在训练数据集中查找最近的数据点,即它的“最近邻居”

首先,让我们调查一下我们是否能够确认模型复杂性和准确性之间的联系:

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(diabetes.loc[:, diabetes.columns != 'Outcome'], diabetes['Outcome'], stratify=diabetes['Outcome'], random_state=66)from sklearn.neighbors import KNeighborsClassifiertraining_accuracy = []
test_accuracy = []
# try n_neighbors from 1 to 10
neighbors_settings = range(1, 11)for n_neighbors in neighbors_settings:
    # build the model
    knn = KNeighborsClassifier(n_neighbors=n_neighbors)
    knn.fit(X_train, y_train)
    # record training set accuracy
    training_accuracy.append(knn.score(X_train, y_train))
    # record test set accuracy
    test_accuracy.append(knn.score(X_test, y_test))plt.plot(neighbors_settings, training_accuracy, label="training accuracy")
plt.plot(neighbors_settings, test_accuracy, label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
plt.legend()
plt.savefig('knn_compare_model')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5

上图显示了 y 轴上的训练集和测试集精度与 x 轴上的 n_neighbors 设置的对比。考虑到如果我们选择一个单一的最近邻,对训练集的预测是完美的。但是当考虑更多的邻居时,训练精度下降,这表明使用单个最近邻居会导致模型过于复杂。最好的表现是大约 9 个邻居。

该图建议我们应该选择 n_neighbors=9。我们到了:

knn = KNeighborsClassifier(n_neighbors=9)
knn.fit(X_train, y_train)print('Accuracy of K-NN classifier on training set: {:.2f}'.format(knn.score(X_train, y_train)))
print('Accuracy of K-NN classifier on test set: {:.2f}'.format(knn.score(X_test, y_test)))

K-NN 分类器在训练集上的准确率:0.79

K-NN 分类器在测试集上的准确率:0.78

逻辑回归

逻辑回归是最常见的分类算法之一。

from sklearn.linear_model import LogisticRegressionlogreg = LogisticRegression().fit(X_train, y_train)
print("Training set score: {:.3f}".format(logreg.score(X_train, y_train)))
print("Test set score: {:.3f}".format(logreg.score(X_test, y_test)))

训练集精度:0.781

测试设定精度:0.771

C=1 的默认值提供了 78%的训练准确率和 77%的测试准确率。

logreg001 = LogisticRegression(C=0.01).fit(X_train, y_train)
print("Training set accuracy: {:.3f}".format(logreg001.score(X_train, y_train)))
print("Test set accuracy: {:.3f}".format(logreg001.score(X_test, y_test)))

训练设定精度:0.700

测试设定精度:0.703

使用 C=0.01 会导致训练集和测试集的精确度都较低。

logreg100 = LogisticRegression(C=100).fit(X_train, y_train)
print("Training set accuracy: {:.3f}".format(logreg100.score(X_train, y_train)))
print("Test set accuracy: {:.3f}".format(logreg100.score(X_test, y_test)))

训练集精度:0.785

测试设定精度:0.766

使用 C=100 会导致训练集的精度稍微高一点,而测试集的精度稍微低一点,这证实了正则化程度较低且更复杂的模型可能不会比默认设置概括得更好。

因此,我们应该选择默认值 C=1。

让我们用正则化参数 c 的三种不同设置来可视化模型学习的系数。

更强的正则化(C=0.001)将系数越来越推向零。更仔细地观察该图,我们还可以看到特征“DiabetesPedigreeFunction”,对于 C=100、C=1 和 C=0.001,系数为正。这表明高“糖尿病”特征与样本是“糖尿病”相关,不管我们看的是哪种模型。

diabetes_features = [x for i,x in enumerate(diabetes.columns) if i!=8]plt.figure(figsize=(8,6))
plt.plot(logreg.coef_.T, 'o', label="C=1")
plt.plot(logreg100.coef_.T, '^', label="C=100")
plt.plot(logreg001.coef_.T, 'v', label="C=0.001")
plt.xticks(range(diabetes.shape[1]), diabetes_features, rotation=90)
plt.hlines(0, 0, diabetes.shape[1])
plt.ylim(-5, 5)
plt.xlabel("Feature")
plt.ylabel("Coefficient magnitude")
plt.legend()
plt.savefig('log_coef')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6

决策图表

from sklearn.tree import DecisionTreeClassifiertree = DecisionTreeClassifier(random_state=0)
tree.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))

训练集上的精度:1.000

测试集上的精度:0.714

训练集的准确率为 100%,而测试集的准确率要差得多。这表明该树过拟合,不能很好地推广到新数据。因此,我们需要对树进行预修剪。

我们设置 max_depth=3,限制树的深度可以减少过度拟合。这导致训练集的精确度较低,但测试集的精确度有所提高。

tree = DecisionTreeClassifier(max_depth=3, random_state=0)
tree.fit(X_train, y_train)print("Accuracy on training set: {:.3f}".format(tree.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(tree.score(X_test, y_test)))

训练集上的准确率:0.773

测试集精度:0.740

决策树中的特征重要性

特征重要性评定每个特征对于树所做决策的重要性。对于每个特征,它是一个介于 0 和 1 之间的数字,其中 0 表示“完全没有使用”,1 表示“完美地预测了目标”。特征重要性的总和总是 1:

print("Feature importances:\n{}".format(tree.feature_importances_))

特征重要度:[ 0.04554275 0.6830362 0。0.0.0.27142106 0.0.】

然后,我们可以将特性的重要性可视化:

def plot_feature_importances_diabetes(model):
    plt.figure(figsize=(8,6))
    n_features = 8
    plt.barh(range(n_features), model.feature_importances_, align='center')
    plt.yticks(np.arange(n_features), diabetes_features)
    plt.xlabel("Feature importance")
    plt.ylabel("Feature")
    plt.ylim(-1, n_features)plot_feature_importances_diabetes(tree)
plt.savefig('feature_importance')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7

特征“葡萄糖”是迄今为止最重要的特征。

随机森林

让我们对糖尿病数据集应用一个由 100 棵树组成的随机森林:

from sklearn.ensemble import RandomForestClassifierrf = RandomForestClassifier(n_estimators=100, random_state=0)
rf.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(rf.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(rf.score(X_test, y_test)))

训练集上的精度:1.000

测试集上的精度:0.786

在不调整任何参数的情况下,随机森林给我们提供了 78.6%的准确性,优于逻辑回归模型或单个决策树。但是,我们可以调整 max_features 设置,看看结果是否可以改进。

rf1 = RandomForestClassifier(max_depth=3, n_estimators=100, random_state=0)
rf1.fit(X_train, y_train)
print("Accuracy on training set: {:.3f}".format(rf1.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(rf1.score(X_test, y_test)))

训练集上的精度:0.800

测试集精度:0.755

它没有,这表明随机森林的默认参数工作良好。

随机森林中的特征重要性

plot_feature_importances_diabetes(rf)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8

与单一决策树类似,随机森林也非常重视“葡萄糖”特征,但它也选择“身体质量指数”作为第二大信息特征。构建随机森林的随机性迫使算法考虑许多可能的解释,结果是随机森林比单棵树捕捉到更广泛的数据图像。

梯度推进

from sklearn.ensemble import GradientBoostingClassifiergb = GradientBoostingClassifier(random_state=0)
gb.fit(X_train, y_train)print("Accuracy on training set: {:.3f}".format(gb.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gb.score(X_test, y_test)))

在训练集上的精度:0.917

测试集上的精度:0.792

我们可能会过度适应。为了减少过度拟合,我们可以通过限制最大深度来应用更强的预修剪,或者降低学习速率:

gb1 = GradientBoostingClassifier(random_state=0, max_depth=1)
gb1.fit(X_train, y_train)print("Accuracy on training set: {:.3f}".format(gb1.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gb1.score(X_test, y_test)))

训练集上的精度:0.804

测试集上的精度:0.781

gb2 = GradientBoostingClassifier(random_state=0, learning_rate=0.01)
gb2.fit(X_train, y_train)print("Accuracy on training set: {:.3f}".format(gb2.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(gb2.score(X_test, y_test)))

训练集上的精度:0.802

测试集上的精度:0.776

正如所料,降低模型复杂性的两种方法都降低了训练集的准确性。然而,在这种情况下,这些方法都没有提高测试集的泛化性能。

即使我们对模型并不满意,我们也可以将特性的重要性可视化,以便更深入地了解我们的模型:

plot_feature_importances_diabetes(gb1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 9

我们可以看到,梯度增强树的特征重要性有点类似于随机森林的特征重要性,在这种情况下,它对所有特征进行加权。

支持向量机

from sklearn.svm import SVCsvc = SVC()
svc.fit(X_train, y_train)print("Accuracy on training set: {:.2f}".format(svc.score(X_train, y_train)))
print("Accuracy on test set: {:.2f}".format(svc.score(X_test, y_test)))

训练集上的精度:1.00

测试集精度:0.65

该模型在很大程度上过度拟合,在训练集上得到满分,而在测试集上只有 65%的准确率。

SVM 要求所有的特征在相似的尺度上变化。我们需要重新调整我们的数据,使所有要素的比例大致相同:

from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit_transform(X_test)svc = SVC()
svc.fit(X_train_scaled, y_train)print("Accuracy on training set: {:.2f}".format(svc.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.2f}".format(svc.score(X_test_scaled, y_test)))

训练集上的精度:0.77

测试集上的精度:0.77

缩放数据产生了巨大的差异!现在,我们实际上是欠拟合的,训练集和测试集的性能非常相似,但不太接近 100%的准确性。从这里开始,我们可以尝试增加 C 或 gamma 来适应更复杂的模型。

svc = SVC(C=1000)
svc.fit(X_train_scaled, y_train)print("Accuracy on training set: {:.3f}".format(
    svc.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.3f}".format(svc.score(X_test_scaled, y_test)))

训练集上的精度:0.790

测试集精度:0.797

这里,增加 C 允许我们改进模型,导致 79.7%的测试集准确性。

深度学习

from sklearn.neural_network import MLPClassifiermlp = MLPClassifier(random_state=42)
mlp.fit(X_train, y_train)print("Accuracy on training set: {:.2f}".format(mlp.score(X_train, y_train)))
print("Accuracy on test set: {:.2f}".format(mlp.score(X_test, y_test)))

训练集上的精度:0.71

测试集精度:0.67

多层感知器(MLP)的准确性不如其他模型,这可能是由于数据的缩放。深度学习算法还期望所有输入特征以相似的方式变化,并且理想情况下具有 0 的均值和 1 的方差。我们必须重新调整我们的数据,以满足这些要求。

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit_transform(X_test)mlp = MLPClassifier(random_state=0)
mlp.fit(X_train_scaled, y_train)print("Accuracy on training set: {:.3f}".format(
    mlp.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.3f}".format(mlp.score(X_test_scaled, y_test)))

训练集上的准确率:0.823

测试集精度:0.802

让我们增加迭代次数:

mlp = MLPClassifier(max_iter=1000, random_state=0)
mlp.fit(X_train_scaled, y_train)print("Accuracy on training set: {:.3f}".format(
    mlp.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.3f}".format(mlp.score(X_test_scaled, y_test)))

训练集上的准确率:0.877

测试集上的精度:0.755

增加迭代次数只会提高训练集的性能,而不会提高测试集的性能。

让我们增加 alpha 参数并增加权重的更强正则化:

mlp = MLPClassifier(max_iter=1000, alpha=1, random_state=0)
mlp.fit(X_train_scaled, y_train)print("Accuracy on training set: {:.3f}".format(
    mlp.score(X_train_scaled, y_train)))
print("Accuracy on test set: {:.3f}".format(mlp.score(X_test_scaled, y_test)))

训练集上的准确率:0.795

测试集精度:0.792

结果是好的,但是我们不能进一步提高测试精度。

因此,我们目前为止最好的模型是缩放后的默认深度学习模型。

最后,我们绘制了在糖尿病数据集上学习的神经网络中第一层权重的热图。

plt.figure(figsize=(20, 5))
plt.imshow(mlp.coefs_[0], interpolation='none', cmap='viridis')
plt.yticks(range(8), diabetes_features)
plt.xlabel("Columns in weight matrix")
plt.ylabel("Input feature")
plt.colorbar()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 10

从热点图中,很难快速指出哪些要素与其他要素相比权重相对较低。

总结

我们练习了一系列用于分类和回归的机器学习模型,它们的优点和缺点是什么,以及如何控制每个模型的复杂性。我们看到,对于许多算法来说,设置正确的参数对于良好的性能非常重要。

我们应该能够知道如何应用、调整和分析我们上面实践的模型。现在轮到你了!尝试将这些算法应用于 scikit-learn 中的内置数据集或您选择的任何数据集。机器学习快乐!

创建这篇文章的源代码可以在这里找到。我将很高兴收到关于上述任何反馈或问题。

参考:用 Python 进行机器学习的介绍

面向所有人的机器学习

原文:https://towardsdatascience.com/machine-learning-for-everyone-46731056d0e6?source=collection_archive---------10-----------------------

What does that mean ?

这个标题回避了问题"那是什么意思?”。好吧,机器学习这个术语可能对你来说很陌生,但是人工智能怎么样,我打赌你听说过。首先,我们只能说机器学习是人工智能的一个子集,它已经在人工智能领域取得了很多进展。用关键词“机器学习”在谷歌上快速搜索会得到以下建议

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

machine learning for …

我就开门见山了。这是一系列的帖子,涵盖了机器学习最基本的算法之一,即决策树。现在,在你认为这是一个点击诱饵之前,让我告诉你这篇文章根本不会涉及任何数学

管他呢,我为什么要看?

人工智能已经开始改变人类的日常生活方式。我们在网上出现的每一点都与一个人工智能元素有关。智能手机,智能手表,智能家居设备,语音助手(谷歌助手SiriCortana 等)都写满了 AI。

Alexa 这样的语音助手可以在你说话时理解句子,并做出智能回答,并不断适应你的需求。现在,如果你对它们是如何工作的一点也不好奇,那么老实说,你不必跟着读下去。然而,如果你是,这是一个完美的开始。

人工智能是一个更广泛的目标,而机器学习是实现这一目标的手段。它是使用数据来学习行为和做出决策的方法的设计和研究。决策树是一种基本的 ML 算法。

这篇文章试图让你怀疑你在日常生活中一直在使用 ML 概念,尽管是潜意识的。

如何最好地阅读这篇文章

只是坐下来放松一下。这篇文章非常轻松,完全不涉及数学。事实上,我讲了一个 8 岁小孩想要更多巧克力的故事。感兴趣吗?跟着读。

Enough said, let’s get to it.

简的日记

简只是另一个聪明的 8 岁孩子,她喜欢’‘海绵宝宝’,更重要的是 巧克力。 她每天都去她妈妈玛丽那里要巧克力,有时要不止一块。她母亲有时给她巧克力,有时不给*【没有人应该被拒绝巧克力* ☹️】。

简是一个好奇的女孩。她想提前知道她妈妈是否会答应她要巧克力的请求,甚至在问她之前。不知道该怎么办,她去找她的父亲**‘汤姆’**描述她的情况。汤姆被他宝贝女儿的好奇心所激发,想了一会儿。过了一段时间,他打电话给简,并送给她一本日记。他让简写下她向母亲要巧克力时的观察。

汤姆说“简,把你 10 天的观察记录在日记里,然后我们再进一步讨论”

Let’s do it!

第十一天

第十一天,简带着她的小日记本跑来找汤姆。她坐在她父亲旁边的床上说

我做到了,爸爸

“太好了”,汤姆回答道,然后开始打开日记本。

让我们看看你这里有什么

  1. 早上我问妈妈要一块巧克力,她说不要。
  2. 当我得到一块巧克力时,已经是晚上了。她似乎心情很好。
  3. 梅姨走过来时,我要了一块巧克力。明白了。小菜一碟。
  4. 甚至在我今天要巧克力之前,她就说不要。她很刻薄
  5. 我牙痛,所以妈妈带我去看牙医。今天没有巧克力。
  6. 由于牙痛,我甚至没有要巧克力。没有巧克力
  7. 她希望她能给我巧克力。但是我的牙齿会疼,所以不能吃巧克力。不过她很开心。
  8. 大卫叔叔今天来了。尽管牙疼,我今天还是吃了一块巧克力。我猜是小狗脸起了作用。
  9. 我早上又要了一块巧克力。为什么妈妈这么严格。不凉
  10. 过了这么多天,我今天看到妈妈唱歌了。我认为要一块巧克力是个好主意。明白了,耶。

“日记写得很好,简”,汤姆说。

汤姆翻看日记,做了一个小表格,让简更清楚地查看数据。

汤姆:我看了你的日记,并根据你的观察做了一个简单的表格。你觉得我做的表对吗?

简:是的,爸爸。我觉得不错。

汤姆:现在让我们根据你的观察,试着想一想我们是否能预测得到巧克力的可能性。

简:好的,爸爸。

汤姆:那么告诉我,你认为你妈妈什么时候很有可能给你糖果。

**简:**爸爸,这很简单。每当有客人来家里,妈妈会按要求给我一块巧克力。

汤姆:太棒了。你的观察是正确的。现在让我们制作一个新的表格,去掉那些观察值。

汤姆:现在告诉我,她什么时候可能不给你巧克力?

简:我不确定爸爸,但是我想每次我牙痛的时候她都不会给我巧克力。

汤姆:你说得对,简,虽然有一次她在你牙痛的时候给了你一块巧克力,但是在这种情况下,她很可能不会给你任何巧克力。

汤姆:现在我们来看看更新后的表格。我将删除您牙疼并且没有吃巧克力时的所有观察结果。

简:这个看起来不错。哦,等等,我想到了。现在我得看看妈妈的情绪对她给我一块巧克力的影响。

汤姆:很好,继续努力。

简:所以看起来每当妈妈心情好的时候,她都会给我一块巧克力。

汤姆:太棒了,简,太棒了。现在,如果你能总结出你所学到的东西,我会给你一块巧克力。

简:当有客人来访时,我可能会得到一块巧克力。但是,如果没有客人,那就要看两件事了。首先,如果我牙痛,我很可能得不到任何巧克力。第二,如果我有一颗快乐的牙齿,那么就看妈妈给我一块巧克力的心情了。对不对,爸爸。

汤姆:来,拿着你的巧克力!

所以简是吃着巧克力长大的,因为她从 8 岁起就知道什么时候向妈妈要巧克力,而且成功率很高。

但是决策树在哪里呢?

好吧好吧,让我们用简的总结做一个决策树。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

如果你一直读下去,你会发现决策树并没有那么糟糕。考虑到我们有一些数据,它们很容易建立。

我倾向于认为,人类的很多决策都是由这样的决策树或经验法则来决定的,这些决策树或经验法则是我们多年来根据各种经验建立起来的。例如,我们有一个经验法则,不要把手放在火里,因为我们很可能会受伤。

所以你看,机器学习只是在更大范围内玩。这是从更大的数据中挖掘意义,有更多的变量,解决的问题比“简会得到巧克力吗”复杂得多

你仍然不相信机器学习吗?

黑客的机器学习

原文:https://towardsdatascience.com/machine-learning-for-hackers-b60bfb9bbade?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本周,我在 Dev-ES meetup 上做了题为“黑客机器学习入门”的演讲。

机器学习是一个超级酷的学科,其应用范围从语音识别和识别图片中的对象到建造无人驾驶汽车。深度学习是机器学习的一个子领域,在谷歌、脸书和微软等科技公司的商业模式中发挥着至关重要的作用。

我的主要目标是提出一种研究机器学习的方法,这种方法主要是动手操作,并为初学者抽象出大部分数学知识。

许多人对那些尽快告诉他们多元微积分、推断统计学和线性代数是先决条件的书籍和课程感到气馁。即使这些事情(非常)重要,我们也可以通过让他们尽早接触高级代码,然后再向他们展示幕后发生的事情,来让更多的机器学习工程师参与进来。

我们试图通过使用 Python notebooksscikit-learn 作为前几个例子,然后在 TensorFlow 之上使用 TFLearn 来识别手写数字,从而使它尽可能简单。

下面是 GitHub 上的代码*(警告:有些东西可能是葡萄牙语的)*:

[## gabrielcs/机器学习简介

intro-machine-learning -代码来自我在 Dev-ES Meetup #1 上发表的演讲“黑客机器学习入门”

github.com](https://github.com/gabrielcs/intro-machine-learning)

为了吸引更多的人,我确保跟进一些很酷的东西,比如迁移学习、生成模型和敌对网络。

同样,如果您懂葡萄牙语,请随意浏览演示文稿:

如果你也想让我浏览一下博客上的一些代码,请告诉我。

这篇帖子的葡萄牙语版本已经在 Dev-ES 社区博客上 发表

NIPS 的医疗保健机器学习

原文:https://towardsdatascience.com/machine-learning-for-healthcare-at-nips-c96127bbbae?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今年 NIPS 举办了两次医疗保健/医药相关的研讨会。医疗保健的机器学习 (ML4H)和医学成像符合 NIPS。自然,有些人可能会想知道这两者之间的区别。ML4H 专注于将机器学习应用于医疗保健的许多不同领域,包括药物研发、医院运营、精准医疗等。这涉及多种技术,包括计算机视觉、NLP 和时间序列预测。正如我上个月所描述的,MedNIPs 专注于机器学习在医学成像方面的具体应用。换句话说,ML4H 更通用。有一些重叠,但是因为我在上一篇文章中详细介绍了成像,所以我将把重点放在 ML4H 涉及的所有其他领域。

有趣的是,尽管两个研讨会的演讲者处理了机器学习和医学的不同领域,但似乎有一个普遍的潜在主题:有限和/或混乱数据的问题。同样,研讨会上展示的技术,如多任务学习、用 GANs 生成合成数据以及将人类反馈纳入培训,都旨在解决这一基本问题。

[不幸的是,与 MedNIPs 不同,ML4H 的演讲(据我所知)没有一个是在线的,只有一些摘要是在线的。此外,周五的大部分时间,我都在跑来跑去,试图把自己的海报印出来。因此,我可能遗漏了一些重要的部分。因此,如果其中一位演示者或其他与会者想要添加一些东西,请随时留下评论,我会确保将它包括在内]。

医院运营

机器学习有可能改善医院运营和护理。几位特邀发言人和专题演讲人讨论了这个问题。在许多领域,机器学习都有可能提高医院的护理质量。费·李非在斯坦福大学发表了关于减少医院获得性感染和改善护理的最新研究的主题演讲。费飞讨论了大多数研究如何专注于寻找新药或更好地解释放射学报告。然而,医疗保健的很大一部分不仅仅发生在实验室,而是与医疗保健专业人员和他们的病人之间的互动。她认为,通过研究和增强机器学习的日常互动,我们可能会拯救更多的生命。这些领域包括减少医院获得性感染、监控 ICU 活动和预测人员配备水平。

米歇尔·郭(Michelle Guo)等人去年夏天在波士顿发表了一篇关于识别违反手部卫生协议的文章,在这篇文章的扩展中,他们发表了一篇关于使用“视点不变卷积神经网络”自动检测医院中潜在风险手部卫生场景的海报。他们使用深度图像,并将其输入卷积网络,以对照片中采取的行动类型进行分类。在这里,他们感兴趣的是将照片归类为接触病人或环境中的无菌区。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Classification of surgical instruments from page 2 of Jin et al.

本次研讨会的最佳论文是 Amy Jin 等人(也来自菲菲的研究小组)的论文使用基于区域的卷积神经网络在手术视频中进行工具检测和手术技能评估,描述了如何使用基于区域的 CNN,如 F-RCNN,来评估外科医生的技能。他们概述了一种跟踪和分析手术视频中工具使用的方法。这种方法可以为外科医生提供有价值的反馈,告诉他们手术效果如何以及需要改进哪些地方。特别是,他们跟踪工具的切换和手术的长度,以评估外科医生的技能。这种类型的监测可能会减少手术失误的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Classifying patient actions in an ICU Ward. Taken from Bianconi et al. poster.

加布里埃尔·比安科尼等人(也来自菲菲的研究小组)的另一篇聚焦文章描述了使用 RNNs 对 ICU 移动护理活动的基于视觉的预测。这项工作试图分类病人的行为在 ICU 病房的医院使用 HIPPA 投诉深度传感器。解释这些活动有多重好处;例如,它可用于衡量医院对协议的遵守情况,以及遵守协议与总体患者结果之间的关系。

南加州大学的 David Kale 介绍了如何创建 MIMIC-III 数据的公共基准。他的团队训练了一个多任务 LSTM 来预测四个相关指标,包括总死亡率、住院时间、疾病表型和生理衰退。他们在网上发布了他们的模型以及生成他们所使用的特定训练和测试集所必需的代码。总之,这是多任务学习在医疗保健中的一个有趣的应用,它提供了一些有价值的基准来比较未来的结果。

ML 支持的治疗

几篇论文描述了强化学习在治疗败血症和预测某人是否患有疟疾方面的应用,我认为这很有趣。在此之前,我曾设想 RL 是一个小众主题,只研究像 PacMan 或 Alpha Go 这样有明确规则的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure from page 7 Futoma et al.

Futoma 等人的“学习用多输出高斯过程深度递归 Q 网络治疗脓毒症”描述了强化学习和高斯过程的应用。他们的论文采用了两个主要部分协同工作 MGP 或多高斯过程和循环 Q 网络。MGP 过程处理时间序列患者生理数据,这通常是草率的,因为它是在不同的时间间隔记录的,而递归 q 网络学习临床策略。细节有些复杂,但总的来说,这是一个非常有趣的许多不同主题的综合。总的来说,作者估计他们的方法可以减少 8.2%的总患者死亡率(从 13.2%的总基线)。

Rajpurkar 等人的一篇题为“通过使用深度强化学习有效调查家庭进行疟疾可能性预测”的健康政策导向论文描述了训练一个 RL 代理问一系列问题来预测某人是否患有疟疾。具体来说,作者写道“RL 代理学习确定接下来要问哪个调查问题以及何时停止,以根据他们迄今为止的回答来预测他们患疟疾的可能性”(Rajpurkar 等人的摘要)。

另一篇专注于治疗的论文是“大型决策空间中相关决斗强盗与临床治疗的应用”在这篇论文中,作者将探索临床决策空间表述为一个有趣的 K 臂土匪问题。然而,这带来了问题,因为决策空间非常大,这意味着在传统方法收敛到最佳 arm 之前可能需要很长时间。为了克服这一点,他们开发了一种名为 CorrDuel 的算法,该算法利用了臂之间的相关性,以便更快地收敛。然后,他们将此应用于帮助找到最佳的电刺激,以帮助截瘫患者重新控制他们的运动(通过这些脊髓刺激),甚至站立。

最后,陈等人的混合梯度推进树和神经网络预测手术室数据也提出了一种预测缺氧的方法。

药物发现和个性化医疗

几位演讲者谈到了使用机器学习进行药物发现。例如,Atul Butte 在他的聚光灯下,讨论了从临床试验数据中挖掘数据,并将其输入机器学习算法,以发现新药。此外,他描述了数据可视化技术,用于绘制患者最可能的预后。(Butte 的幻灯片可以在 slideshare 上找到,如果你有时间,非常值得一读)。其他几位演讲者详细介绍了个性化医疗可能影响的具体领域。

Jennifer Chayes 介绍了“癌症免疫治疗中机器学习的挑战和机遇”Chayes 描述了预测新抗原的免疫原性和患者对特定类型免疫疗法的反应的挑战。通过更好地预测新抗原的免疫原性,更容易发现实际上具有抗肿瘤特性的新抗原。第二,通过预测患者对治疗的具体反应,可以在免疫系统没有被化疗拖垮时更早地引入治疗。然而,像医学研究中的许多其他领域一样,这受到小数据集的限制。除了很小之外,数据集还是非常高维的。

另一个亮点是“问医生——通过积极的专家知识启发改善药物敏感性预测”,描述了如何通过询问“专家”来改善衡量癌细胞对药物的特定疗效的模型。这种技术有点类似于主动学习(我在以前的文章中谈到过)。在这种情况下,专家是治疗血癌的专家。通常情况下,专家征集算法会随机向专家发送药物特征,并指出这些特征是否相关。作者的主要贡献是设计了一种算法,该算法通过仅向专家发送他们的反馈提供最大效用的对(而不是随机对)来减少发送给专家的查询的数量,并且除了相关和非相关反馈之外还包括方向性反馈。

综合数据

几篇论文讨论了使用 GANs 生成合成数据。这是一项有用的技术,因为 HIPPA 合规性导致获取真实医疗数据的复杂性。论文“来自双生成对抗网络的合成医学图像”,作者 JT·吉巴斯描述了如何使用一对 GANs 生成逼真的视网膜图像。研究人员为合成生成的医学影像照片引入了一个名为 SynthMed 的在线储存库。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Diagram from Synthetic Medical Images from Dual Generative Adversarial Networks

另一篇论文,用递归条件 gan生成实值(医学)时间序列(这也是一篇专题演讲),描述了如何用 R-gan 生成合成 ICU 时间序列数据。然后他们进行了几个有趣的实验来验证他们的结果;例如,他们观察重构误差的分布,定性地比较生成的样本,以及插值。总之,这篇论文展示了一个非常好的 GANs 用例,可以帮助解决困扰研究人员的许多数据访问问题。如果你喜欢 GANs,这绝对是一个值得一看的作品。

其他的

我发现其他几篇论文很难归入上述类别,但还是觉得很有趣。简而言之:

Kalyanam 等人撰写的“在 Twitter 上非法营销和推广处方药的检测和特征描述”。

用于流式细胞术分析的蒙德里安过程由纪等人完成。

最后,研讨会上总共有 97 篇论文,因此我肯定会错过一些好的。因此,我鼓励你去看看工作坊网站。此外,如果任何人对其他主题演讲有任何信息,请告诉我们,我会添加它。

公告

我将在 2 月 7 日星期三做一个关于使用小数据集的演讲,重点是医疗保健应用。演讲将于美国东部时间晚 7 点至 9 点在奥罗诺举行,并将通过 Zoomhttp://zoom.us/j/794523352的以下链接进行直播。

CurativeAI Slack 频道现在有 40 多个成员,并且还在继续。所以如果你还没有加入讨论,就来加入吧。

面向营销的机器学习

原文:https://towardsdatascience.com/machine-learning-for-marketing-25e26efbcefe?source=collection_archive---------18-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2018 年 AI 在营销方面有哪些最好的应用?

在过去的 10 年里,没有哪个领域比数字营销领域更加持续地应用人工智能。这是因为,与其他行业相比,互联网公司:

  • 收集更大、更结构化的数据集
  • 雇佣了更多的数据工程师
  • 更注重技术的文化。

但是,尽管大型科技巨头(谷歌、脸书、亚马逊……)正在大量使用机器学习来优化营销,许多组织仍然刚刚起步。

如果你想知道如何最好地在营销中使用机器学习/人工智能,这里有一个当今顶级应用的概述:

预测目标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你如何确保营销信息只传递给正确的用户?

预测目标定位是对基于细分甚至基于触发的目标定位的一大改进。这是个性化目标的层次结构:

0 级 : 无针对性营销。

  • 街上的传单。(但是谁会这么做呢?)

一级 : 细分目标定位。

  • 确定典型客户的特征,并针对该角色进行营销。

二级: 触发瞄准。

  • 使用关键行为来确定你的客户什么时候准备购买——就像他们刚买了一辆车。并且只针对那些顾客。

三级: 预测瞄准。

  • 利用你掌握的关于顾客的所有行为和人口统计线索,对他们现在购买的可能性做出个人预测。

在触发瞄准中,您手动选择触发器,而在预测瞄准中,您使用机器学习算法自动学习正确的触发器

机器学习模型可以通过这种方式捕捉到更多的复杂性,从而显著提高性能,因为它们在识别理想客户时更加准确。

我见过客户通过从触发目标转向预测目标,将营销收入提高了 200–300%。

预测销售线索评分

线索不再仅仅是电话号码和名字。现在,您可以轻松捕捉线索中的 50-100 个其他因素:

  • 采集渠道;
  • 与网站的互动(每次访问、文章阅读、下载或参加网上研讨会);
  • 账户信息(规模、投资轮次、新闻、员工波动)。

每条信息都包含一条线索,表明该销售线索是否准备购买。但是除了设置一些明显的过滤器之外,很难有效地使用这些信息。

“关于下载白皮书后直接观看网上研讨会的潜在客户比中间浏览 10 页的潜在客户更感兴趣?”

很难说——这只是你可能会问的数千个问题中的一个。

机器学习是进行这种分析的理想工具: 算法从过去的销售中学习创造良好销售线索的模式,然后用它们来预测你管道中每条线索的准确转化概率。然后你的销售团队就更清楚该关注谁了。

为了让算法能够找到可靠的模式,你的客户关系管理中至少需要 300 名已经购买的客户,以及至少 300 名没有购买的客户。

客户终身价值预测

你的客户群价值多少?谁会是你最好的客户?

估计一个多样化的 B2C SaaS 客户群的未来价值有点像一门黑色艺术——很多时候,你只需为每个客户选择一个平均值。

然而,与预测目标和线索评分类似,你可以使用机器学习来学习客户行为之间的联系(他们购买了什么和多少,登录等。)及其总终身价值。

如果你有足够多的客户,足够多的关于他们的数据,并且你的产品已经存在足够长的时间,那么这是一个很好的方式:

  • 找出哪种类型的客户更有价值;
  • 决定更关注哪些客户;
  • 估计客户群的总价值(一次一个用户)。

建议

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们不想再没完没了地浏览类别了。我们期望更相关的电影或书籍首先出现。推荐算法变得越来越好——如此之好,以至于对许多 Spotify 或网飞用户来说,自动推荐已经完全取代了手动发现。

推荐算法确保你的顾客看到更多他们想要的东西,最终这意味着他们会买更多。但是有很多不同的推荐算法——你需要哪一个取决于你的情况。以下是三个最重要的类别:

1.基于内容

基于内容的算法向你的用户推荐与他们以前喜欢的东西相似的东西。想想同类型的电影,或者同价位的酒店。

2.合作的

协同过滤算法找到有相似品味的用户,然后向对方推荐对方喜欢的东西。这就像让你所有品味相似的朋友给你推荐一样。在某种程度上,这些算法利用了你所有用户的智能,可以在不知道他们推荐什么的情况下做出准确的推荐。

3.混合物

混合推荐器以某种方式结合了前两种方法。许多正在使用的最强大的算法是混合推荐器(如网飞)。

适合您具体情况的最佳推荐方案还取决于:

  • 你对你的用户了解多少;
  • 你有多少新用户和回头客;
  • 你每个月增加多少新产品(像电影或书籍);
  • 产品与用户的比率。

一旦你建立了你的推荐算法,你可以用很多方法来应用它:

  • 对搜索结果进行排序;
  • 寻找相似的产品(电影、酒店、书籍);
  • 为每个用户提供个性化推荐(比如 Spotify Weekly)。

流失预测

客户流失是一个杀手。了解哪些客户将很快取消他们的会员资格,为什么他们打算离开,然后做出改变以留住他们可以拯救一家公司

但是经常没有一个明确的原因导致客户流失。而是很多不同的原因和组合。

一个简单的分析只会给你一个简单的答案——你最终会怀疑许多快乐的顾客在鼓捣。所以你因为给了错误的用户折扣而损失了收入。

再说一次,机器学习是微妙区分会流失和不会流失的用户的理想工具。它发现了隐藏在用户行为中的过多模式。

有了一个良好的模型,你可以将用户从最有可能流失到最不可能流失进行排序,并关注那些最需要关注的用户。

流失模型还可以帮助你了解导致流失的因素,并在必要时调整你的产品。

我是柏林一家精品机器学习咨询公司 Data Revenue 的创始人。如果你需要机器学习营销方面的帮助,请联系

原载于www.datarevenue.com

面向产品经理的机器学习第一部分——问题映射

原文:https://towardsdatascience.com/machine-learning-for-product-managers-part-i-problem-mapping-5436132c3a6e?source=collection_archive---------3-----------------------

机器学习和人工智能是最近的热门话题。因此,我发现许多产品经理和潜在的产品经理找到我,问我他们如何才能成为更好的 ML 项目经理。由于机器学习和产品管理的交叉是一个相当全面的话题,一篇文章无法公正地描述它。因此,我打算把它分成三部分

第一部分——问题映射:什么类型的问题最适合机器学习

第二部分——ML 技能:在构建利用机器学习的产品时,项目经理还需要哪些额外的技能组合

第三部分——警告:在构建使用机器学习 的产品时,有哪些常见的错误

这篇文章将重点讨论如何确定你试图解决的问题是否需要机器学习。

关注用户

使用机器学习构建伟大产品的首要原则是关注用户需求。我发现的一个常见误解是,人们认为机器学习在某种程度上从根本上改变了项目经理的技能。机器学习本身并不是目的。机器学习是解决真实用户需求的工具。我发现许多人(和公司)有一项很酷的人工智能技术,并且认为这项技术本身就证明了它的用途。如果你有一项很酷的技术可以应用,想想通过这项技术可以解决什么问题,或者增强什么体验。

话虽如此,有很多初创公司利用机器学习提出了很酷的创新,但并不总是专注于解决用户的问题/需求。它们在生态系统中起着非常重要的作用——它们推动技术前沿。这些初创公司往往会被收购,很少能够自己找到适合市场的产品。然而,作为一个项目经理,如果你试图建立一个服务于用户的产品,你的用户所面临的问题,而不是技术,需要成为你的关注点。

这给我们带来了挑战— 如何判断 ML 可以帮助解决哪些用户/业务问题。就其核心而言,ML 最适合于需要某种模式识别的问题。通常这些问题可以分为几种不同的类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户被过多的数据淹没

如果用户必须筛选大量数据来完成任务,ML/AI 是一个很好的工具。谷歌和必应等搜索技术使用各种机器学习算法为用户呈现最佳结果。例如,当你搜索菜谱时,哪个菜谱会排在你的第一个搜索结果的前面,这是基于对你自己的搜索模式以及与你相似的人的搜索和点击行为模式的了解。分类问题也能够利用机器学习。如果你想对数百万个关于教育的帖子进行聚类,机器学习可以帮助对它们进行分组,假设你已经通过提供已知关于教育的类似文档的合理样本来训练模型。

需要复杂认知能力的问题

自动驾驶汽车需要能够理解周围的环境。自动分类照片的图库应用程序需要能够检测地点、人和事物。这需要复杂的认知技能,建造这种智能机器的唯一方法是向它提供大量数据,并通过模式识别进行学习。

预测和预报

最常见的问题之一是预测用户是否喜欢某个商品。用户会喜欢新闻订阅中的故事吗?购买了 Dropbox 订阅的用户会流失吗?如果您的问题需要您预测用户是否会执行某个动作,ML 是一个很好的选择。

同样,如果你想预测 2018 年 12 月的销售情况(并且你的业务基本面没有发生巨大变化),你可以输入过去所有年份的历史数据,ML 模型可以在考虑季节性的同时进行预测。销售预测、库存使用——所有这些都可以从 ML 中受益。

异常检测

ML 的一大好处是发现数据中的异常。由于 ML 擅长模式识别,任何不符合被认为是规范的行为模式的东西都可以很容易地被检测出来。欺诈检测是一个主要的应用。如果我的用卡模式不同于我的常规行为,这可能表明我的卡已经被破坏。类似地,如果黑客试图访问企业内部网,查看入侵者的访问模式,人们可以使用机器学习轻松标记这种行为。

通过建议帮助决策

如果你想帮助你的用户做决定,比如说,提供购买、参观、观看等方面的建议。机器学习是一个很好的工具。通过观察人们观看类似事物、购买类似产品、访问类似网站的模式,机器学习可以减轻做出决定的认知负担。通过浏览建议,可能没有浏览整个视频目录或搜索所有项目的用户能够找到与他们的兴趣相似的项目。

与人类互动的体验

如果你正在寻找建立一个与人类交流的服务,因此需要理解自然语言,ML 是需要的。所有正在开发的助手技术——Alexa、Siri、谷歌助手——都是通过能够将人类语言翻译成可操作的任务来工作的。教机器理解人类语言需要向它们提供大量关于语言、语音语调的数据,然后让机器开始将语音映射到语言、指令和任务。

增加/创造新的体验

增加/创造新的体验是 ML 最令人兴奋的领域。有没有一种体验,因为上面提到的所有能力,现在成为可能?SnapChat 过滤器是如何使用 ML 增强体验的一个很好的例子。通过使用面部识别算法,SnapChat 滤镜能够检测面部轮廓,从而将创意滤镜覆盖在面部,从而使照片分享更加有趣。你能想到更多可以通过 ML/AI 改进的体验吗?

产品经理的机器学习第二部分——ML 技能

原文:https://towardsdatascience.com/machine-learning-for-product-managers-part-ii-ml-skills-ce7c3cee3246?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是面向产品经理的机器学习系列的三个部分的继续。

的第一个注解关注的是什么问题最适合应用机器学习技术。这篇笔记将深入探讨在构建利用机器学习的产品时,项目经理需要哪些额外技能

正如我在第一部分中提到的,无论你是否在机器学习驱动的解决方案领域工作,项目经理所需的核心技能集都不会改变。产品经理通常使用五种核心技能——客户同理心/设计印章、沟通、协作、商业战略和技术理解。从事 ML 工作将继续利用这些技能。一个确实得到更多延伸的领域是技术理解,特别是机器学习领域。这并不是说,除非你有深厚的技术功底,否则你就不能成为 ML 项目经理。但是你确实需要了解机器学习系统是如何运作的,以便做出好的产品决策。你可以依靠你的工程师,或者通过书籍和课程巩固你的知识,但是如果你对系统没有很好的理解,你的产品可能会导致不好的结果。

算法有局限性

机器学习中使用的每种算法或技术都是针对某项任务进行优化的,并不总是能够考虑到现实世界情况所需要的各种细微差别。 B 能够理解算法的影响和局限性,有助于你理解客户体验中存在的差距,并通过产品设计或选择其他 ML 技术来解决这些差距 。如果你是这个领域的项目经理,这是绝对必要的技能。 我举几个例子吧。

数据偏差

机器学习算法从数据中学习模式。因此,输入算法的数据质量决定了产品的成功。构建机器学习产品的首要挑战之一是确保数据代表将使用该产品的用户。

还记得谷歌把黑人的照片贴上大猩猩的标签吗?

确保在数据中代表所有用户是产品成功的基础。

有时,这些偏差可能存在,不是因为数据收集的错误,也是因为数据可用性的偏差。例如,当 IBM Watson 被训练学习语言时,它被输入了城市字典,它学会了说脏话。预期的结果是学习“礼貌”的人类语言,但相反,因为数据也有脏话,所以机器也学习了。因此,在重新训练 Watson 之前,需要清理数据。

再比如。与发展中国家相比,发达国家接入互联网的用户可能更多。因此,如果你建立模型,比如说基于互联网搜索的搜索行为,来自发达经济体的用户分布会更高。因此,当你对搜索模式进行建模时,对于那些不经常搜索的用户来说,比如说印度的首次上网用户,它可能不是很准确。认识到数据中的偏差将有助于你意识到这些算法可能对用户体验产生的意想不到的影响。

精确度和召回率的权衡

最近,我和一个团队进行了交谈,这个团队和我的团队使用完全相同的预测产品,但是两个团队的目标不同。该产品提供了对不良行为的预测。我的团队关心的是确保只有坏演员,而没有好演员被系统过滤掉。我们希望每个优秀的演员都能使用这个功能。所以,我们关心精确度。另一个团队关心的是不允许坏演员使用该产品,即使这意味着一些好演员也被限制使用该产品。所以,他们关心回忆。精确和召回总是相互权衡。如果你提高精确度,你的回忆就会降低,反之亦然。

弄清楚你的用例是否需要更强调精确性或回忆性,会改变工程师选择的模型的调整。因此,仔细考虑需要什么来解决用户问题是很重要的。类似于下图的权衡曲线用于检查与您正在使用的模型相关的指标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Precision-Recall curve

根据问题的要求,模型可以调整到这个前沿的任何地方。有时,如果你需要改变边界本身,那么你可能需要选择不同的机器学习模型(这可能会带来其他限制)

冷启动问题

机器学习算法需要数据才能进行模式识别。冷启动是一个用于汽车的术语,指发动机处于冷态,汽车可能无法发挥最佳功能。然而,一旦引擎启动并运行,你就可以开始了。类似地,当算法没有关于用户或物品的任何数据时,会出现冷启动问题,导致次优体验。

冷启动问题有两种类型

基于用户的 :这是用户第一次使用你的产品,机型对用户没有信号。以网飞为例。网飞根据您的观看历史向您推荐要观看的节目和电影。但是,你第一次使用网飞时,它没有关于你观看行为的数据,因此,算法很难预测你的观看偏好。

这个问题可以用几种方法解决。几个常见的是

  1. 你提示用户从随机选择中选择几部最喜欢的电影来给你数据
  2. 您可以使用关于用户的一些基本信号来提供最佳推荐,比如查看用户从哪里登录,并假设用户可能喜欢该位置的其他用户喜欢的电影。例如,如果您从加州登录,您可能会显示其他加州用户观看的前 10 个节目
  3. 策展。你可能有一个手动策划的黄金集,比方说有史以来最受欢迎的电影,你可以作为一个开始体验来展示。

基于项目的 :这是当一个项目第一次被提供给你的用户,很难挑选给哪些用户看的时候。例如,当一部新电影进入网飞目录时,决定向谁推荐这部电影是很困难的,尤其是在这部电影的元数据很少的情况下。类似于基于用户的冷启动问题,这可以通过许多技术来解决。

  1. 人工注释:你可以让人工用元数据来注释这个项目,给你关于它是什么的信号。例如,你可以把一部新电影添加到目录中,然后由一个专家小组对其进行分类。根据分类,您可以决定这部电影应该向哪一组用户播放。

2.算法上:通俗地说,算法技术的工作原理是向许多用户展示新项目,以了解他们的偏好,从而获得更多关于谁更喜欢这个项目的信号,并缩小用户群。如果你有兴趣深入这个话题,你可以看看这本关于多臂强盗算法的入门书。

在异常检测中,冷启动问题会引发许多错误警报。例如,当一名新员工正在访问数据库系统时,ML 系统可能会认为他/她是入侵者,并可能发出假警报。当您在国外旅行或进行大额购物时,可能会遇到这种情况。渡过这一难关的方法是创建收集反馈(在行动之前或之后)的机制,以纠正误报,这将我带到下一节。

反馈回路

由于算法并不完美,它们可能会做出错误的预测和模式识别。您需要在您的产品中创建一些机制来为算法提供反馈,这样它们就可以随着时间的推移提高准确性。这些反馈循环可能就像记录负面信号一样简单,例如,用户浏览新闻标题的速度与阅读时间。当算法出错时,你甚至可以通过让用户介入来提供更明确的反馈循环——拇指向下、划掉等等。或者当算法做得很好,允许用户竖起大拇指,分享,保存等。

探索 vs 利用

让我们以上面网飞的例子来说明这个挑战。比方说,网飞的算法已经计算出我喜欢看足球。所以,我在我的推荐中看到与足球相关的电影、节目和纪录片。我看了一些,现在网飞向我展示了更多与足球相关的内容,这种循环还在继续。这里的算法是利用他们可用的信号——我喜欢足球,因此优化了它。然而,我对足球之外的许多内容很感兴趣。我也喜欢技术,但是网飞没有给我看任何与技术相关的内容。这被称为过滤泡沫,最近在媒体中。

为了给用户提供一个平衡的内容视图,系统应该定期向用户介绍那些偏好信号较少的项目,允许用户探索。新内容的引入可以是随机的(给我看几个瑜伽、美食、野生动物、科技节目),也可以是习得的(比如其他更喜欢足球的用户,更喜欢美食纪录片)。

以上并不是算法所有局限性的详尽列表,因为随着新算法的出现,可能会有新的漏洞暴露出来。你可能会问——我怎么可能理解算法之间的差距,尤其是如果你不理解算法本身。这里是你戴上首相帽的地方。

  1. 向您的工程团队提供清晰的用例。与您的工程团队一起浏览这些用例,解释这些用例的预期体验。这些用例应该包括产品的主要、次要和负面人物角色。一旦您的模型准备就绪,评估模型输出是否与这些用例的预期体验相匹配。
  2. 注重数据收集。询问有关如何清理和组织数据的问题。这些数据能代表你的用户群吗?
  3. **使用产品解决方案填补空白。**如果模型输出不符合您的预期,找出您可以做什么来提高模型解释这些用例的能力,或者这些用例是否扩展了模型的机器学习能力,然后创建产品解决方案、过滤器等。来填补这些空白。

产品经理的机器学习第三部分——注意事项

原文:https://towardsdatascience.com/machine-learning-for-product-managers-part-iii-caveats-79803a7548ef?source=collection_archive---------4-----------------------

这是面向产品经理的机器学习系列的三个部分的继续。

的第一个注解关注的是什么问题最适合应用机器学习技术。的第二个注解谈到了当构建机器学习产品时,一个项目经理需要哪些额外的技能。本笔记将重点讨论在构建 ML 产品时有哪些常见错误。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这篇笔记的目的是向 ML 水平有限的人提供对常见陷阱的一般理解,以便您可以就这些问题与您的数据科学家和工程师进行对话。我不会在本说明中深入探讨这些问题。但是,如果你有问题,请评论。如果对这些领域中的一个更感兴趣,我可能会写一个单独的说明。

数据问题

无数据:这似乎是显而易见的(甚至可能很好笑,我在一个关于 ML 的博客上提到了它)。然而,当我经营我的公司 PatternEQ 时,我们在那里向公司销售 ML 解决方案,我惊讶地发现有这么多公司想要使用 ML,并建立了“智能软件”战略,但没有任何数据。*没有数据就无法使用机器学习。*您要么需要贵公司收集的数据,要么可以通过与拥有数据的其他公司合作来获取公共数据或积累数据。没有数据,就没有 ML。句号。(在评估许多人工智能初创公司声称的工作时,这也是一个很好的过滤器。这些初创公司声称他们有一项很酷的人工智能技术,但没有数据来运行这些技术。)

小数据:今天发布的大多数 ML 技术都专注于大数据,并且倾向于在大数据集上工作良好。您也可以在小数据集上应用 ML,但是您必须非常小心,以便模型不受离群值的影响,并且您不依赖于过于复杂的模型。将 ML 应用于小数据可能会带来更多的开销。因此,应用统计技术而不是最大似然法来分析小数据集是非常好的。例如,大多数临床试验往往样本量较小,并通过统计技术进行分析,这些见解完全有效。

稀疏数据:有时候即使你有很多数据,你实际可用的数据可能还是稀疏的。比方说,在亚马逊上,你有数以亿计的购物者和数以千万计的商品可以购买。每个购物者只购买几百万种产品中的几百种,因此,你对大多数产品没有反馈。如果没有人或很少用户购买,这就使得推荐一个产品变得更加困难。当使用稀疏数据集时,您必须仔细考虑您所使用的模型和工具,因为现成的技术将提供低于标准的结果。此外,稀疏数据集的计算效率较低,因为大部分数据集是空的。

**高维数据:**如果你的数据有很多属性,即使是这些属性,模型也很难消费,它们也会占用更多的计算和存储资源。高维数据将需要被转换到小维空间,以便能够用于大多数 ML 模型。此外,在丢弃维度时,您需要小心,以确保您没有丢弃信号,而只是丢弃了冗余的维度。这就是特性选择非常重要的地方。

知道哪些维度对你想要的结果真正重要,这既是直觉的问题,也是统计学的问题。项目经理应该参与到与工程师/数据科学家的特性选择讨论中。这就是产品直觉发挥作用的地方。例如,假设我们试图预测一个视频有多好,虽然你可以通过查看用户观看了多少视频来了解视频的参与度,但你通过 UX 研究发现,用户可能会在视频播放时打开一个标签并切换到另一个标签。因此,观看时间与质量并不完全相关。因此,我们可能希望包括其他功能,如在播放视频时标签中是否有任何活动,以真正了解视频的质量。

数据清洗:你不能只是使用现成的数据,然后应用一个模型。ML 的成功很大程度上取决于数据的质量。就质量而言,我不仅仅指它的功能有多丰富,还指它清理得有多好。是否移除了所有异常值,是否对所有字段进行了规范化,数据中是否存在坏字段和损坏的字段-所有这些都可能决定模型的成败。就像他们说的,垃圾进垃圾出。

配合问题

过拟合

为了解释过度拟合,我要讲一个有趣的故事。在 2007 年金融危机期间,出现了一次量化宽松崩盘。本来不应该关联的事件,结果却关联了,很多被认为不可侵犯的假设都被违背了。算法出了问题,三天之内,量化基金积累了巨大的损失。

2007 年金融危机期间,我在一家名为 D.E.Shaw 的量化对冲基金担任工程师。当时,D.E. Shaw 遭受的损失相对低于其他量化基金。为什么?其他量化基金较新,它们的算法是根据 2007 年之前的数据训练的,这些数据从未出现过下跌。因此,当价格开始暴跌时,模型不知道如何反应。另一方面,D.E. Shaw 在 1998 年曾面临俄罗斯卢布的类似暴跌。D.E. Shaw 也遭受了损失,但自那以后,它的算法一直在进行校准,以预测这种情况。因此,它的算法不会像其他公司那样崩溃。

这是一个过度拟合的极端情况。通俗地说,这些模型是针对后见之明而优化的,而不是针对远见。竞争对手的量化模型是基于只有在股市表现良好时才成立的假设进行训练的,因此,当崩盘发生时,他们无法预测正确的结果,最终做出错误的决定,从而导致更多的损失。

如何避免这种情况?确保您可以在各种数据上测试您的模型。此外,仔细看看你的假设。如果经济发生变化,用户行为发生变化,它们还会成立吗?这是我不久前写的一篇文章,它更多地讨论了管理假设的话题。

欠适

当您的模型对于它试图学习的数据来说过于简单时,会导致拟合不足。比方说,你试图预测购物者是否会购买蛋糕粉。蛋糕粉是可以自由购买的。诸如可支配收入、蛋糕粉价格、附近的竞争对手等因素。会影响预测。但是,如果您不考虑这些经济因素,如就业率、通货膨胀率以及其他杂货店的增长,而只关注 Safeway 内的购物行为,您的模型将无法准确预测销售额。

如何避免这种情况?这就是产品/客户直觉和市场理解派上用场的地方。如果你的模型表现不好,问问你是否已经收集了准确理解问题所需的所有数据。您能否从其他来源添加更多数据,以帮助更好地了解您试图建模的潜在行为?

计算成本

构建 ML 产品时,一个被忽视的领域是机器学习的计算开销有多大。通过 AWS 和 Azure 等服务,你可以引导和建立机器学习能力。然而,在规模上,你需要做艰苦的数学计算,你愿意承担多少计算成本来为你的用户提供机器学习功能。基于成本,您可能需要权衡预测的质量。例如,您可能无法存储关于您的产品的所有数据。或者您可能无法提供最新的建议,不得不提前预计算,等等。了解您的工程团队如何权衡计算成本与 ML 精度/召回率等。将帮助您了解产品质量是否受到影响。

如何使用机器学习进行生产优化

原文:https://towardsdatascience.com/machine-learning-for-production-optimization-e460a0b82237?source=collection_archive---------6-----------------------

利用数据提高性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我的其他帖子中,我已经涉及了一些主题,如:用于异常检测和状态监控的机器学习,h 如何结合机器学习和基于物理的建模,以及如何避免机器学习用于时间序列预测的常见陷阱。但在这篇文章中,我将讨论机器学习如何用于生产优化。

在不久的将来,完全自主的生产设备将会出现。但即使在今天,机器学习也可以对生产优化产生巨大影响。在这里,我将仔细看看一个具体的例子,如何利用机器学习和分析来解决现实生活中遇到的复杂问题。

什么是生产优化?

产品优化是很多行业普遍存在的问题。在我们的上下文中,优化是指任何使某样东西——如设计、系统或决策——尽可能好、实用或有效的行为、过程或方法。最低成本、最佳质量、性能和能耗的决策过程就是这种优化的例子。

为了进一步具体化这一点,我将重点关注我们一直在与一家全球石油和天然气公司合作的一个案例。目前,该行业主要关注数字化和分析。这种关注是由每天从多达数千个传感器积累的大量数据推动的,即使是在单个生产设施上。直到最近,由于能力的限制以及缺乏必要的技术和数据管道来从传感器和系统收集数据以供进一步分析,这些数据的利用受到限制。

在石油和天然气行业的背景下,生产优化本质上是“生产控制”:您最小化、最大化或以石油、天然气,或许还有水的生产为目标。你的目标可能是最大化产油量,同时最小化产水量。或者可以将石油产量和气油比(GOR)运行到指定的设定点,以维持期望的储层条件。

生产优化有多复杂?

石油和天然气的生产是一个复杂的过程,为了满足短期、中期和长期目标,必须做出许多决策,从规划和资产管理到小的纠正措施。短期决策必须在几个小时内做出,通常被描述为日常生产优化。他们通常试图通过优化控制生产过程的各种参数来最大化油气产量。

在今天的大多数情况下,日常生产优化是由控制海上生产设施的操作者执行的。这种优化是一项非常复杂的任务,其中大量的可控参数都会以某种方式影响生产。必须调整大约 100 个不同的控制参数,以找到所有变量的最佳组合。考虑下图所示的非常简单的优化问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这种情况下,只有两个可控参数影响你的生产率:“变量 1”和“变量 2”。优化问题是找到这些参数的最优组合,以最大化生产率。解决这个二维优化问题并不复杂,但想象一下这个问题扩展到 100 维。那是另一个故事了。从本质上来说,这就是操作人员在优化生产时试图做的事情。今天,这一点执行得如何在很大程度上取决于操作人员以前的经验,以及他们对所控制的过程的理解程度。

机器学习算法可以积累无限的数据集

这就是基于机器学习的方法变得非常有趣的地方。操作员执行的优化主要基于他们自己的经验,随着时间的推移,随着他们对过程设备的控制越来越熟悉,这些经验也在不断积累。这种从以前的经验中学习的能力正是机器学习中如此吸引人的地方。通过分析来自平台传感器的大量历史数据,算法可以学习理解各种参数之间的复杂关系及其对生产的影响。

算法从经验中学习的事实,原则上类似于操作员学习控制过程的方式。然而,与人类操作员不同,机器学习算法在几年的时间内分析数百个传感器的完整历史数据集没有任何问题。与人脑相比,它们可以积累无限的经验。

优化算法如何工作

拥有一个能够根据你调整的控制参数预测生产率的机器学习算法,是一个非常有价值的工具。回头参考上图中的简化图,基于机器学习的预测模型为我们提供了“生产率景观”,其波峰和波谷代表高产量和低产量。多维优化算法随后在该场景中移动,寻找代表最高可能生产率的最高峰。
通过在这个“生产率景观”中移动,该算法可以给出如何最好地达到这个峰值的建议,即调整哪些控制变量以及调整多少。因此,这种基于机器学习的生产优化包括三个主要部分:

1.预测算法:

你的第一步,也是最重要的一步,是确保你有一个机器学习算法,能够在给定所有操作员可控变量设置的情况下,成功预测正确的生产率。

2.多维优化:

您可以使用预测算法作为优化算法的基础,该算法探索调整哪些控制变量以最大限度地提高产量。

3.可操作的输出:

作为优化算法的输出,您可以获得关于调整哪些控制变量以及这些调整可能带来的生产率提高的建议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于机器学习的优化算法可以在来自生产设施的实时数据流上运行,当它识别出提高产量的潜力时,向操作者提供建议。算法的典型可操作输出如上图所示:调整某些控制器设定值和阀门开度的建议。它还估计了生产率的潜在增长,在这种情况下大约为 2 %。

这种基于机器学习的优化算法可以作为操作人员控制过程的支持工具,帮助他们做出更明智的决策,以最大限度地提高产量。

生产设备的完全自主运行离未来还有一段距离。在此之前,基于机器学习的支持工具可以对生产优化的执行方式产生重大影响

在未来,我相信机器学习将会被用在比我们今天所能想象的更多的地方。你认为它会对各个行业产生什么影响?我很想在下面的评论中听到你的想法。

如果你有兴趣了解更多与人工智能/机器学习和数据科学相关的主题,你也可以看看我写的其他一些文章。你会发现他们都列在我的中型作者简介,你可以在这里找到。

而且,如果你想成为一个媒体会员,免费访问平台上的所有资料,你也可以使用下面我的推荐链接。(注意:如果您使用此链接注册,我也会收到一部分会员费)

[## 通过我的推荐链接加入媒体- Vegard Flovik

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@vflovik/membership)

更多来自 Vegard Flovik 媒体:

  1. 蒙特卡洛方法简介
  2. 从物理学到数据科学的转变
  3. 什么是图论,你为什么要关心它?
  4. 用于图像分类的深度迁移学习
  5. ‘建造一个能读懂你思想的人工智能
  6. 机器学习:从炒作到现实应用
  7. 人工智能和大数据隐藏的风险
  8. 用于供应链管理的人工智能:预测分析和需求预测
  9. 如何(不)使用机器学习进行时间序列预测:避免陷阱
  10. 如何使用机器学习进行异常检测和状态监控
  11. 你如何向人工智能系统教授物理学?
  12. 我们能使用纳米级磁铁建立人工大脑网络吗?

人工智能研讨会——从宣传到现实应用

用 Python 实现零售价格推荐的机器学习

原文:https://towardsdatascience.com/machine-learning-for-retail-price-suggestion-with-python-64531e64186d?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo credit: Pexels

日本最大的社区购物应用 Mercari 深刻地认识到一个问题。他们希望向卖家提供定价建议,但这很难,因为他们的卖家可以在 Mercari 的市场上出售任何东西或任何一捆东西。

在这个机器学习项目中,我们将建立一个自动建议正确产品价格的模型。我们收到以下信息:

train_id —列表的 id

名称—列表的标题

item_condition_id —卖家提供的物品的状况

类别名称—列表的类别

品牌名称—品牌的名称

价格——物件的销售价格。这是我们将要预测的目标变量

运费—如果运费由卖方支付,则为 1,由买方支付,则为 0

item_description —项目的完整描述

电子设计自动化(Electronic Design Automation)

数据集可以从 Kaggle 下载。为了验证结果,我只需要 train.tsv。让我们开始吧!

import gc
import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.sparse import csr_matrix, hstack
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_squared_error
import lightgbm as lgbdf = pd.read_csv('train.tsv', sep = '\t')

将数据随机分为训练集和测试集。我们只为 EDA 使用训练集。

msk = np.random.rand(len(df)) < 0.8
train = df[msk]
test = df[~msk]train.shape, test.shape

((1185866,8),(296669,8))

train.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1

train.info()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2

价格

train.price.describe()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3

项目的价格是右偏的,绝大多数项目的价格在 10-20 英镑。然而,2009 年定价最贵的项目。所以我们将对价格进行对数变换。

plt.subplot(1, 2, 1)
(train['price']).plot.hist(bins=50, figsize=(12, 6), edgecolor = 'white', range = [0, 250])
plt.xlabel('price', fontsize=12)
plt.title('Price Distribution', fontsize=12)plt.subplot(1, 2, 2)
np.log(train['price']+1).plot.hist(bins=50, figsize=(12,6), edgecolor='white')
plt.xlabel('log(price+1)', fontsize=12)
plt.title('Price Distribution', fontsize=12)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4

船舶

超过 55%的项目运费由买家支付。

train['shipping'].value_counts() / len(train)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5

运费和价格有什么关系?

shipping_fee_by_buyer = train.loc[df['shipping'] == 0, 'price']
shipping_fee_by_seller = train.loc[df['shipping'] == 1, 'price']fig, ax = plt.subplots(figsize=(18,8))
ax.hist(shipping_fee_by_seller, color='#8CB4E1', alpha=1.0, bins=50, range = [0, 100],
       label='Price when Seller pays Shipping')
ax.hist(shipping_fee_by_buyer, color='#007D00', alpha=0.7, bins=50, range = [0, 100],
       label='Price when Buyer pays Shipping')
plt.xlabel('price', fontsize=12)
plt.ylabel('frequency', fontsize=12)
plt.title('Price Distribution by Shipping Type', fontsize=15)
plt.tick_params(labelsize=12)
plt.legend()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6

print('The average price is {}'.format(round(shipping_fee_by_seller.mean(), 2)), 'if seller pays shipping');
print('The average price is {}'.format(round(shipping_fee_by_buyer.mean(), 2)), 'if buyer pays shipping')

卖家支付运费的平均价格为 22.58

如果买家支付运费平均价格为 30.11

我们在价格上进行对数变换后再进行比较。

fig, ax = plt.subplots(figsize=(18,8))
ax.hist(np.log(shipping_fee_by_seller+1), color='#8CB4E1', alpha=1.0, bins=50,
       label='Price when Seller pays Shipping')
ax.hist(np.log(shipping_fee_by_buyer+1), color='#007D00', alpha=0.7, bins=50,
       label='Price when Buyer pays Shipping')
plt.xlabel('log(price+1)', fontsize=12)
plt.ylabel('frequency', fontsize=12)
plt.title('Price Distribution by Shipping Type', fontsize=15)
plt.tick_params(labelsize=12)
plt.legend()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7

很明显,当买家支付运费时,平均价格会更高。

类别名称

print('There are', train['category_name'].nunique(), 'unique values in category name column')

类别名称列中有 1265 个唯一值

十大最常见的类别名称:

train['category_name'].value_counts()[:10]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8

项目条件与价格

sns.boxplot(x = 'item_condition_id', y = np.log(train['price']+1), data = train, palette = sns.color_palette('RdBu',5))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 8

每个项目条件 id 之间的平均价格似乎各不相同。

经过上述探索性的数据分析,我决定使用所有的功能来建立我们的模型。

LightGBM

在微软DMTK 项目的保护下, LightGBM 是一个使用基于树的学习算法的梯度推进框架。它被设计为分布式和高效的,具有以下优点:

  • 训练速度更快,效率更高
  • 更低的内存使用率
  • 更高的精确度
  • 支持并行和 GPU 学习
  • 能够处理大规模数据

因此,我们打算试一试。

常规设置:

NUM_BRANDS = 4000
NUM_CATEGORIES = 1000
NAME_MIN_DF = 10
MAX_FEATURES_ITEM_DESCRIPTION = 50000

我们必须修复列中缺少的值:

print('There are %d items that do not have a category name.' %train['category_name'].isnull().sum())

有 5083 个项目没有类别名称。

print('There are %d items that do not have a brand name.' %train['brand_name'].isnull().sum())

有 506370 件商品没有品牌名称

print('There are %d items that do not have a description.' %train['item_description'].isnull().sum())

有 3 项没有描述。

LightGBM 的帮助函数:

def handle_missing_inplace(dataset): 
    dataset['category_name'].fillna(value='missing', inplace=True) 
    dataset['brand_name'].fillna(value='missing', inplace=True) 
    dataset['item_description'].replace('No description yet,''missing', inplace=True) 
    dataset['item_description'].fillna(value='missing', inplace=True)def cutting(dataset):
    pop_brand = dataset['brand_name'].value_counts().loc[lambda x: x.index != 'missing'].index[:NUM_BRANDS]
    dataset.loc[~dataset['brand_name'].isin(pop_brand), 'brand_name'] = 'missing'
    pop_category = dataset['category_name'].value_counts().loc[lambda x: x.index != 'missing'].index[:NUM_CATEGORIES]def to_categorical(dataset):
    dataset['category_name'] = dataset['category_name'].astype('category')
    dataset['brand_name'] = dataset['brand_name'].astype('category')
    dataset['item_condition_id'] = dataset['item_condition_id'].astype('category')

删除价格= 0 的行

df = pd.read_csv('train.tsv', sep = '\t')
msk = np.random.rand(len(df)) < 0.8
train = df[msk]
test = df[~msk]
test_new = test.drop('price', axis=1)
y_test = np.log1p(test["price"])train = train[train.price != 0].reset_index(drop=True)

合并训练和新测试数据。

nrow_train = train.shape[0]
y = np.log1p(train["price"])
merge: pd.DataFrame = pd.concat([train, test_new])

培训准备

handle_missing_inplace(merge)
cutting(merge)
to_categorical(merge)

计数矢量化名称和类别名称列。

cv = CountVectorizer(min_df=NAME_MIN_DF)
X_name = cv.fit_transform(merge['name'])cv = CountVectorizer()
X_category = cv.fit_transform(merge['category_name'])

TF-IDF 矢量化 item_description 列。

tv = TfidfVectorizer(max_features=MAX_FEATURES_ITEM_DESCRIPTION, ngram_range=(1, 3), stop_words='english')
X_description = tv.fit_transform(merge['item_description'])

标签二进制 brand_name 列。

lb = LabelBinarizer(sparse_output=True)
X_brand = lb.fit_transform(merge['brand_name'])

为 item_condition_id 和 shipping 列创建虚拟变量。

X_dummies = csr_matrix(pd.get_dummies(merge[['item_condition_id', 'shipping']], sparse=True).values)

创建稀疏合并。

sparse_merge = hstack((X_dummies, X_description, X_brand, X_category, X_name)).tocsr()

去除文档频率为<=1.

mask = np.array(np.clip(sparse_merge.getnnz(axis=0) - 1, 0, 1), dtype=bool)
sparse_merge = sparse_merge[:, mask]

Separate train and test data from sparse merge.

X = sparse_merge[:nrow_train]
X_test = sparse_merge[nrow_train:]

Create dataset for lightgbm.

train_X = lgb.Dataset(X, label=y)

Specify our parameters as a dict.

params = {
        'learning_rate': 0.75,
        'application': 'regression',
        'max_depth': 3,
        'num_leaves': 100,
        'verbosity': -1,
        'metric': 'RMSE',
    }
  • Use ‘regression’ as application as we are dealing with a regression problem.
  • Use ‘RMSE’ as metric because this is a regression problem.
  • “num_leaves”=100 as our data is relative big.
  • Use “max_depth” to avoid overfitting.
  • Use “verbosity” to control the level of LightGBM’s verbosity (<0: Fatal).
  • “learning_rate” determines the impact of each tree on the final outcome.

Training Start

Training a model requires a parameter list and data set. And training will take a while.

gbm = lgb.train(params, train_set=train_X, num_boost_round=3200, verbose_eval=100)

Predict

y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)

Evaluation

from sklearn.metrics import mean_squared_error
print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)

的特征,预测的 rmse 为:0.46164222941613137

源代码可以在 Github 上找到。祝你一周工作顺利!

参考:卡格尔

Python 中基于空间的文本分类机器学习

原文:https://towardsdatascience.com/machine-learning-for-text-classification-using-spacy-in-python-b276b4051a49?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo Credit: Pixabay

spaCy 是 Python 中流行且易于使用的自然语言处理库。它提供当前最先进的精度和速度水平,并有一个活跃的开源社区。然而,由于 SpaCy 是一个相对较新的 NLP 库,它不像 NLTK 那样被广泛采用。还没有足够的教程可用。

在这篇文章中,我们将演示如何在没有任何深度学习经验的情况下使用 spaCy 实现文本分类。

数据

对于一个年轻的研究人员来说,寻找和选择一个合适的学术会议来提交他(或她)的学术论文常常是一件既费时又令人沮丧的事情。我们定义“合适的会议”,意思是会议与研究人员的工作一致,并有良好的学术排名。

使用会议进程数据集,我们将按照会议对研究论文进行分类。让我们开始吧。数据集可以在这里找到。

探索

快速浏览一下:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import base64
import string
import re
from collections import Counter
from nltk.corpus import stopwords
stopwords = stopwords.words('english')df = pd.read_csv('research_paper.csv')
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1

没有缺失值。

df.isnull().sum()

标题 0
会议 0
dtype:int 64

将数据拆分为定型集和测试集:

from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.33, random_state=42)print('Research title sample:', train['Title'].iloc[0])
print('Conference of this paper:', train['Conference'].iloc[0])
print('Training Data Shape:', train.shape)
print('Testing Data Shape:', test.shape)

研究题目样本:配合 Smartness:在 Ad-Hoc 网络中使用异构智能天线。
本文发布会:INFOCOM
训练数据形态:(1679,2)
测试数据形态:(828,2)

该数据集由 2507 篇简短的研究论文标题组成,已被分为 5 类(按会议)。下图总结了不同会议的研究论文分布情况。

fig = plt.figure(figsize=(8,4))
sns.barplot(x = train['Conference'].unique(), y=train['Conference'].value_counts())
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2

以下是在 SpaCy 中进行文本预处理的一种方法。之后,我们试图找出提交给第一类和第二类(会议)的论文中使用的热门词汇——INFOCOM & ISCAS

import spacynlp = spacy.load('en_core_web_sm')
punctuations = string.punctuationdef cleanup_text(docs, logging=False):
    texts = []
    counter = 1
    for doc in docs:
        if counter % 1000 == 0 and logging:
            print("Processed %d out of %d documents." % (counter, len(docs)))
        counter += 1
        doc = nlp(doc, disable=['parser', 'ner'])
        tokens = [tok.lemma_.lower().strip() for tok in doc if tok.lemma_ != '-PRON-']
        tokens = [tok for tok in tokens if tok not in stopwords and tok not in punctuations]
        tokens = ' '.join(tokens)
        texts.append(tokens)
    return pd.Series(texts)INFO_text = [text for text in train[train['Conference'] == 'INFOCOM']['Title']]IS_text = [text for text in train[train['Conference'] == 'ISCAS']['Title']]INFO_clean = cleanup_text(INFO_text)
INFO_clean = ' '.join(INFO_clean).split()IS_clean = cleanup_text(IS_text)
IS_clean = ' '.join(IS_clean).split()INFO_counts = Counter(INFO_clean)
IS_counts = Counter(IS_clean)INFO_common_words = [word[0] for word in INFO_counts.most_common(20)]
INFO_common_counts = [word[1] for word in INFO_counts.most_common(20)]fig = plt.figure(figsize=(18,6))
sns.barplot(x=INFO_common_words, y=INFO_common_counts)
plt.title('Most Common Words used in the research papers for conference INFOCOM')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3

IS_common_words = [word[0] for word in IS_counts.most_common(20)]
IS_common_counts = [word[1] for word in IS_counts.most_common(20)]fig = plt.figure(figsize=(18,6))
sns.barplot(x=IS_common_words, y=IS_common_counts)
plt.title('Most Common Words used in the research papers for conference ISCAS')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4

INFOCOM 的热门词汇是“网络”和“网络”。显而易见,INFOCOM 是网络领域和密切相关领域的会议。

ISCAS 排名靠前的词是“基础”和“设计”。它表明 ISCAS 是一个关于数据库、系统设计和相关主题的会议。

带空间的机器学习

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.base import TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS
from sklearn.metrics import accuracy_score
from nltk.corpus import stopwords
import string
import re
import spacy
spacy.load('en')
from spacy.lang.en import English
parser = English()

下面是使用空间清理文本的另一种方法:

STOPLIST = set(stopwords.words('english') + list(ENGLISH_STOP_WORDS))
SYMBOLS = " ".join(string.punctuation).split(" ") + ["-", "...", "”", "”"]class CleanTextTransformer(TransformerMixin): def transform(self, X, **transform_params):
        return [cleanText(text) for text in X] def fit(self, X, y=None, **fit_params):
        return selfdef get_params(self, deep=True):
        return {}

def cleanText(text):
    text = text.strip().replace("\n", " ").replace("\r", " ")
    text = text.lower()
    return textdef tokenizeText(sample):
    tokens = parser(sample)
    lemmas = []
    for tok in tokens:
        lemmas.append(tok.lemma_.lower().strip() if tok.lemma_ != "-PRON-" else tok.lower_)
    tokens = lemmas
    tokens = [tok for tok in tokens if tok not in STOPLIST]
    tokens = [tok for tok in tokens if tok not in SYMBOLS]
    return tokens

定义一个函数来打印出最重要的特征,即具有最高系数的特征:

def printNMostInformative(vectorizer, clf, N):
    feature_names = vectorizer.get_feature_names()
    coefs_with_fns = sorted(zip(clf.coef_[0], feature_names))
    topClass1 = coefs_with_fns[:N]
    topClass2 = coefs_with_fns[:-(N + 1):-1]
    print("Class 1 best: ")
    for feat in topClass1:
        print(feat)
    print("Class 2 best: ")
    for feat in topClass2:
        print(feat)vectorizer = CountVectorizer(tokenizer=tokenizeText, ngram_range=(1,1))
clf = LinearSVC()

pipe = Pipeline([('cleanText', CleanTextTransformer()), ('vectorizer', vectorizer), ('clf', clf)])# data
train1 = train['Title'].tolist()
labelsTrain1 = train['Conference'].tolist()test1 = test['Title'].tolist()
labelsTest1 = test['Conference'].tolist()
# train
pipe.fit(train1, labelsTrain1)# test
preds = pipe.predict(test1)
print("accuracy:", accuracy_score(labelsTest1, preds))
print("Top 10 features used to predict: ")

printNMostInformative(vectorizer, clf, 10)
pipe = Pipeline([('cleanText', CleanTextTransformer()), ('vectorizer', vectorizer)])
transform = pipe.fit_transform(train1, labelsTrain1)vocab = vectorizer.get_feature_names()
for i in range(len(train1)):
    s = ""
    indexIntoVocab = transform.indices[transform.indptr[i]:transform.indptr[i+1]]
    numOccurences = transform.data[transform.indptr[i]:transform.indptr[i+1]]
    for idx, num in zip(indexIntoVocab, numOccurences):
        s += str((vocab[idx], num))

精度:0.7463768115942029
用于预测的前 10 个特征:
第 1 类最佳:
(-0.9286024231429632,‘数据库’)
(-0.8479561292796286,‘芯片’)
(-0.7675978546440636,’ wimax’)
(。

from sklearn import metrics
print(metrics.classification_report(labelsTest1, preds, 
                                    target_names=df['Conference'].unique()))precision    recall  f1-score   support

       VLDB       0.75      0.77      0.76       159
      ISCAS       0.90      0.84      0.87       299
   SIGGRAPH       0.67      0.66      0.66       106
    INFOCOM       0.62      0.69      0.65       139
        WWW       0.62      0.62      0.62       125

avg / total       0.75      0.75      0.75       828

给你。我们现在已经在 SpaCy 的帮助下完成了文本分类的机器学习。

源代码可以在 Github 上找到。过一个学习周末!

参考:卡格尔

面向编程障碍者的机器学习

原文:https://towardsdatascience.com/machine-learning-for-the-programmatically-handicapped-4a786fe43f47?source=collection_archive---------8-----------------------

机器学习是什么,如何和为什么:解释…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以你已经听过几次 20 世纪最常用的术语“机器学习”,你真的很想尝试一下。能有多糟呢?有时候,当你上网在 **Github、**上搜索一些知识库时,你会看到长长的先决条件列表:高级数值计算学位、机器学习博士学位、工程学位、独角兽的血和龙的角。

!你成为深度学习专家的梦想和愿望比 Chicxulub 下降得还快。

使用机器学习算法不一定要成为工程师

了解一些基本的 Python 语法?完美!这就是你所需要的。嗯,网上看起来没那么简单吧?编码基础知识和和钢铁意志是你需要的唯一先决条件,这将使你成为你一直梦想的机器学习摇滚明星!

学习数学

为了完全成为一名 ML 专家,你需要精通 ML 的概念。在不知道基本背景过程的情况下编写 ML 算法就像把一只海龟放在障碍赛中并期望它跳跃。所以不可能!

Coursera、Udemy 和 Udacity 教授初学者著名的 ML 算法背后的概念和数学。关于他们的应用实现的内容和资源也可以在网上找到。研究它们,了解是什么让它们如此通用、实用和用户友好。

神经网络是如何工作的?

你可能会想,看似如此复杂的事情,怎么会如此顺利地给出对你的公司最重要的预测。

简单来说,神经网络是一个受人类大脑启发的 ML 模型。你大脑中的神经元或脑细胞从一端向另一端反复发射小电脉冲,使信息从一个区域发送到另一个区域。这让你在被要求时想到大猩猩,或者在数学考试时进行逻辑思考和处理信息。

整个神经网络结构是一个连续的管道,其中一个计算隐藏层的输出是下一个的输入,直到它到达最终输出层来传递预测。这个新生成的预测数据通过称为**反向传播、**的过程通过隐藏层返回到输入节点,同时更新其权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据陷入这种恶性循环,直到偶然发现最准确的答案。每层都有几个输入节点,对数据进行多重计算。它操纵数据,到处扔和拉伸数据,以得到可能的最佳答案。在直觉上,这就像用一堆不同的方法拧湿毛巾,看看哪一种方法能让最多的水滴掉出来。

这些数据被发送到它前面的隐藏层,对前一层生成的数据执行更复杂的计算。

这个循环一直持续到最后一层,即输出层。这一层中的节点包含整个神经结构的最终预测。最精彩的部分?所有这些都可以在 100 行代码内实现!

这可能看起来令人生畏。然而,我向你保证,我会尽可能简单。有了一步一步的指导,你注定会成为机器学习大师

我看得出你脸上已经有了笑容。“没我想象的那么差!”,你可能会惊呼!

使用 Python 制作人工神经网络(ANN)

我通常使用 Octave GUI 来实现 ML 算法,因为它的语法易于阅读,而且学习起来耗时最短。然而,Python 是一种新兴的 ML 语言,我们现在将使用它。

我们将构建一个具有两个隐藏层的人工神经网络,它将对我们给它的数字执行功能,以最少的时间和最少的错误预测 XOR 值

我们的 Python 模块和框架

我们将使用的包和模块将会非常少。我们需要的是接受一组值并将其压缩成一个向量(n*1 维矩阵)的东西。为什么 NumPy ?它很轻,用途广泛,足以用作我们的基础包,帮助我们塑造矢量,并对其中的元素进行数学和科学计算。

接下来,我们导入时间。时间是一个完美的模块,可以让我们知道自从上次体重更新以来已经过去了多长时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的超参数

超参数是调谐旋钮,它控制着我们的神经网络的行为和表现。这些超参数可以根据您的数据集包含的训练示例的数量或者您的 ML 算法的复杂性而改变。

所以,如果你输入了错误的数字,把你的屏幕炸了,也不用担心。它们可以随时重新调整!

我们现在选择隐藏层中节点数的值 n_hidden ,输入节点数 n_in ,输出节点数 n_outputs ,批量大小 n_sample ,我们的学习速率learning _ rate,以及

设置 n_hidden10n_in10n_outputs10n_sample300learning _ learn

(这些数字已经过测试,到目前为止,它们给出了最好的结果。)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请记住,迭代次数越高,人工神经网络就越精确。然而,计算最佳统计输出所需的总时间会增加

(你可以随便摆弄这些值。然而,有些可能会损害程序的结果;所以要警惕。)

播种我们的进步

我们希望我们所有的结果都是从同一基线计算出来的。当该算法在一次迭代中计算完几个值后,它会返回到最初的起始点 0 ,用存储器中的新值重新进行整个计算。这个过程叫做播种

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

激活函数 Sigmoid

激活功能是激活并调用下一层以开始对前一层中的节点的输出执行大量操作和计算的功能。在这种情况下,我们的输入节点是第一层的一部分。因此,自然地,我们从第一层的输出是在训练例子中使用的数字。

Sigmoid 函数是我们的主要激活函数g(z)werez**是接受我们第一个向量中的特征值的参数,即我们的 X 值(我们的特征向量)。我们来写这个函数吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

激活函数 tanh_prime

我们的第二个激活函数帮助激活我们的第二个隐藏层,并使它能够对s 形层的输出执行计算。让我们继续以同样的方式写作。py 文档。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的培训职能

函数 train() 将获取第二个隐藏层产生的值,并将训练我们的 ML 算法来正确地识别我们的测试数据,这将在本文稍后介绍。下面的代码帮助我们的算法从错误中学习,以最少的时间和错误完全预测事件的可能性或概率

通过交叉熵,我们检查并验证一个事件发生的概率,在这种情况下,一个数字的概率要么是 1,要么是 0。这消除了所有关于事件在我们的输入数据集中发生的非自然概率或可能性(异常)的疑问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

圣杯:预测()函数

这是神经网络的缩影。我们期待已久的时刻。到目前为止,我们编写的所有函数都是这个最终函数。 predict() 函数返回由人工神经网络计算的最终预测值,以及花费的时间和误差。花费的时间和损失(误差)应该是减少的。与实际预期输出相比,这些值确实非常准确。我们开始吧,好吗!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这段代码看起来很小,也不吓人。但是不要被它的外表所迷惑。这几行代码会影响算法如何预测整个问题的结果。

创建图层并生成输入数据

我们离想要实现的目标只有几步之遥!现在,我们创建我们的隐藏层。这些层接收输入数据,并将它们输入到我们的节点,节点对它们进行计算,并调整和更新它们的权重。

为了生成新的数据,我们简单地调用一个 NumPy 函数,使用我们的样本/批量大小和输入节点维度随机得出几个值(1 或 0)。这些数字成为我们输入向量的元素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练我们的算法

我们现在运行一个 for 循环来更新训练过程中的权重。准确度应该随着我们的历元计数而增加。我们还启动计时器来计算自更新过程开始以来经过的毫秒数。同时,我们运行另一个嵌套循环来预测每次迭代后最佳拟合预测线的损失和梯度。

程序运行 100 次迭代。

我们将在终端打印历元计数、损失和时间,以观察和检查我们的进展和准确性。当历元计数增加时,损失和花费的时间应该有下降的趋势(花费的时间可能在增加和减少之间波动。就可以了)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测输出概率

我们现在已经完成了我们的人工神经网络算法的编写!现在,剩下要做的就是调用我们之前写的预测函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们终于完成了!恭喜你!让我们在终端中运行程序,看看我们珍贵的创造的结果。

运行程序

我们已经写完了我们的 ANN!此外,这一切都在 100 行简单的“可解读的”Python 代码之内!除了经营我们的劳动果实还剩下什么!终端运行我们在 testin 训练函数中编写的循环的**。控制台上打印出损耗耗时历元计数。精确度应该随着我们拥有的历元/迭代的数量而增加。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单地

你不需要有任何机器学习的相关经验来构建算法。通过构建人工神经网络,了解计算机科学基础知识足以让你在这个神奇、复杂的机器学习世界中成为一名雄心勃勃的人。

人工神经网络被广泛应用于整个企业领域,因为它们是最可靠和准确的。无论是苹果的 Siri ,谷歌的搜索还是脸书的新闻推送,机器学习都被广泛使用。洗钱正在以难以想象的速度增长和扩散,我们如何利用它,取决于我们自己。在那之前,下一集再见!

原创文章作者,里沙卜·阿南德

交易的机器学习

原文:https://towardsdatascience.com/machine-learning-for-trading-e2a5275b6fe?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

人工智能如何帮助交易者做出更好的决策&提高高频交易

交易是一个竞争激烈的世界。随着人工智能被描绘成万物的新神奇武器,人们对如何使用人工智能进行交易有着巨大的兴趣是可以理解的。

放弃

人工智能确实在交易中发挥了重要作用——但可能不是以你预期的方式。不幸的是,人工智能不能用于驱动一台在每个市场窃取人类交易者午餐的超人交易机器。即使是文艺复兴科技公司也没有这个能力。至少还没有

有何不可?

简短的回答:人类竞争——下面会有更多的介绍。

与此同时,人工智能实际上赢得的战斗要多得多——但仍然意义重大。人工智能与其说是交易者的替代者,不如说是交易者的助手。

以下是当今人工智能应用于交易的四大方式:

分析情绪

人类无法处理所有的信息——但是机器可以接近。有了人工智能,机器现在可以做更多的事情——包括分析和总结文本。

它们可以总结情绪之类的事情:抓取器收集关于特定主题的每日新闻、推文和其他社交媒体帖子,然后人工智能算法(特别是自然语言处理)总结积极或消极观点是否更强。他们甚至可以将文本分类成主题,并自动构建人类可读的文本摘要。

这对交易者来说是非常有价值的信息,他们必须尽快了解最新的动态。

预测真实世界的数据

交易员还使用人工智能来提高输入数据预测的可靠性——这是现实世界中帮助交易员成功的要素。

就像预测的那样:

  • 未来两周东北部的天气模式;
  • 欧洲的太阳能供应;
  • 政治选举的结果。

这些预测是基于其他公司开发的其他算法——但这并不意味着这些预测不能改进。

一个简便的技巧是训练一个算法来将多个专家预测组合成另一个预测——然后这个预测比它所基于的任何预测都更准确。这叫做组装,它工作得很好。

寻找模式

交易是关于识别局部模式——通常在时间和空间上是有限的——然后猜测如何利用它们。寻找模式的过程既费力又耗时。

但是 AI 算法基本上是模式发现机器。如果分析师怀疑特定数据集中的不规则性,他们可以通过使用人工智能来找到它们,从而节省时间。

因此,人工智能可以找到有用的模式,只要有经验丰富的分析师指导,他知道应该寻找什么。这些模式然后被交易者使用,他们把它们和他们的经验和直觉混合在一起,然后应用它们。或者你可以用它们来设计自动交易机——见下一节。

调谐高频交易机器

在高频交易中——顾名思义——机器每天执行数千或数百万笔交易,试图利用只存在于极短时间跨度内的低效率。

人类无法进行这些交易——交易太多了——但人类定义了这些机器运行的规则。

但是,由于市场不断变化,这些机器需要不断调整。那需要很多时间和努力。

人工智能可以自动进行这些重新校准——并做许多重复的统计工作,否则分析师需要做这些工作。

!3 个警告标志!—需要注意的事项

找到一种能够真正印钞的奇迹算法的承诺是如此诱人,许多聪明人都相信了这一点。以下是需要警惕的最重要的陷阱:

1.今天的人工智能并不比人类“聪明”

事实上,与人脑相比,即使是今天最先进的人工智能算法也非常幼稚。

当一种算法在国际象棋或围棋中击败人类时,就像一辆汽车在四分之一英里比赛中击败人类赛跑者一样:是的,机器更快,但这并不意味着它更优越。这只是意味着我们建造了一台机器,它可以在特定的条件下很好地完成非常狭窄的任务。

一开始看起来是这样,但是交易并不是一个狭义的任务。为什么?因为在交易中,你是在和其他人竞争——他们会用尽所有的脑力试图比你聪明。

2.公布的交易策略在现实生活中往往行不通

有很多研究和博客文章承诺基于人工智能的交易算法是有利可图的。但是这些模型在现实生活中并不适用,原因有几个。

**错误的设置。**数量惊人的论文实际上在如何建立他们的训练和测试框架上犯了错误。他们使用在人工智能需要做出决定(数据泄露)或根据当前价格而不是未来价格评估预测时不可用的变量。令人惊讶的错误——但是时间序列数据集对于人脑来说是一件复杂的事情。

选择偏差。基金经理经常被批评将他们更好的回报归因于高超的技能而不是运气。但如果许多基金经理进行大量随机猜测,那么最终会有一些人做出一些不错的猜测。输家倒闭了,我们从来没有听说过他们——所以看起来有很多基金经理拥有战胜市场的技能。

然而在现实中,跑赢市场的基金经理数量与你根据随机猜测所预期的完全一致。

研究论文也是如此。如果你尝试了很多算法,你最终会找到一个似乎能产生一定利润的算法。如果你不告诉每个人你做了多少实验才达到目的,这看起来就像你偶然发现了一个更好的方法。

但是,绝对不能保证这个策略在您测试的特定数据之外也能工作。

**交易费用和滑点。**事实上,建立一个超越市场的交易策略通常很简单——如果你忘记了交易的真实成本。交易费(你为每笔交易支付的费用)和滑点(在你下单和交易之间价格可能会变化的事实)吞噬了很多利润。而且几乎在每一种情况下,这都足以删除你在模拟中看到的利润。

**模式随着时间而变化。**机器学习中最重要的概念之一是在过去的数据中找到模式,并使用它们对未来做出正确的预测。

然而,这在交易中是行不通的。其他交易者竞相寻找相同的模式——所以模式被发现,被利用,然后消失。这意味着模式很少会长期存在,你必须不断发现新的模式。

这需要巨大的适应性——这是人类目前比机器更擅长的。

3.单靠算法永远不会给你带来优势

人们很容易忘乎所以,把算法作为一种交易策略和另一种交易策略之间的主要竞争优势。

这基本上就是像numeric这样的公司所提议的:

  1. 把很多好的模型组合成一个超级模型。
  2. 战胜股市。

但是这个不行。为什么?因为数据击败算法。你给你的算法的数据对你的模型性能的影响比算法有多好要大得多。数字给你的数据是固定的,你不能添加。因此,他们做出的预测总是比交易者的预测差,交易者可以使用的数据没有限制——交易者可以访问开放的数据池,可以不断尝试、测试和添加新的数据点到他们的算法中。

一点希望——低效的市场可能仍然是沃土

交易参与者少、进入壁垒高、交易量有限以及很少有玩家能够使用机器学习的市场可能为纯人工智能交易的成功提供一些机会。

在这些市场中,自动化交易——尤其是机器学习的使用——仍然刚刚开始,构建自动化交易引擎的交易员可以获得足够的优势,从而产生丰厚的利润。

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

我是德国柏林机器学习咨询公司 Data Revenue 的首席执行官。如果你想了解更多关于人工智能的交易或我们的工作,请联系我们。

原载于www.datarevenue.com

用于车辆检测的机器学习

原文:https://towardsdatascience.com/machine-learning-for-vehicle-detection-fd0f968995cf?source=collection_archive---------4-----------------------

我训练了一个支持向量机(SVM)模型来检测道路上的移动车辆。这是 udacity 自动驾驶汽车工程师课程的第五个项目。

这个项目的代码可以在: Github 上找到。
这篇文章也可以在我的网站这里找到。

该项目包括以下几个阶段:

  1. 对数据集执行要素工程。
  2. 在提取的特征上训练 SVM 分类器。
  3. 实现滑动窗口技术来检测图像中车辆。
  4. 使用热图过滤非车辆窗口,并在车辆周围绘制边界框。
  5. 产生一个管道,并生成结果的视频。

本项目的训练数据集由以下样本中的车辆和非车辆图像组成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1. Sample vehicle and non-vehicle images from training dataset

总的来说,训练集包含 8,793 幅车辆图像和 8,968 幅非车辆图像。

特征工程

项目的第一步是对训练数据集执行特征工程,以确定要使用的理想特征描述符。考虑了三个特征描述符:方向梯度直方图(HOG) 特征、空间宁滨特征和颜色直方图特征。

研究人员 Navneet Dalal 和 Bill Triggs 在他们的论文《人类检测的梯度方向直方图》中普及了 HOG 特征描述符。HOG 计算图像局部的梯度方向分布。以下是图像三个颜色通道中每一个的图像样本上的 HOG 特征的可视化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2. Visualization of HOG features for different colour channels.

如何计算 HOG 的详细描述可以在这篇文章中找到。

使用的第二个特征描述符是空间宁滨;为了计算这个特征描述符,使用了 OpenCV 的 resize 函数。缩小图像时,resize 函数执行线性插值空间宁滨运算。

使用的第三个特征描述符是颜色分布(直方图)。计算图像中每个颜色通道的直方图,然后将三个直方图组合起来产生一个特征向量。

实验表明,图像最初被转换到 YCbCr 色彩空间,这是在预测过程中获得最高准确度的理想色彩空间。然后,从三个特征描述符中的每一个构建每幅图像的组合特征向量。该组合的特征向量是用于训练预测模型的特征向量。

SVM 培训

随着我们的特征工程的完成,下一步是实现一个预测模型,该模型能够计算出特征向量是属于车辆还是非车辆。

选择线性支持向量机(SVM) 模型作为预测算法。我摆弄了一下模型的超参数;C 值为 0.001,最大迭代次数为 10,000,可获得约 98%的高精度。以下是用于实现该模型的代码:

该模型需要大约 12 分钟来训练,这对于机器学习模型来说是相对较短的时间。

滑动窗口搜索

为了在视频源上使用我们的预测模型,我们需要提出一种合适且一致的分割算法,让我们能够搜索我们的视频源图像。搜索算法应该从图像中返回子图像,然后将这些子图像输入到我们的模型中进行预测。一种这样的搜索算法是滑动窗口搜索技术。

滑动窗口搜索根据预先选择的比例将搜索区域分割成较小的相同大小的重叠区域。在我们的例子中,我们需要不同比例的滑动窗口区域来说明这样一个事实,即远处的汽车看起来较小,而近处的汽车看起来较大。以下是滑动窗口搜索的四种不同组合,最后一幅图像中的最终组合窗口:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3. Sliding-window search technique with different scale combinations. Final image is of all sliding-window search areas combined.

上述滑动窗口搜索被应用于视频帧中的每个图像。总共有 697 个窗口被输入到每个图像的模型中。

热图阈值

当我们将提取的窗口输入预测模型时,结果是检测到车辆的窗口列表(各种比例),如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4. Sample image with positive windows identified as containing a vehicle.

现在考虑到 SVM 模型的简单性,我们预计有些检测是假阳性的。为了过滤掉这些不正确的检测,一种方法是对我们的正窗口进行阈值处理,使得我们只挑选多于一个窗口重叠的区域。本质上,我们正在生成正窗口的热图。

下图显示了应用于搜索图像的热图阈值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5. Heatmap thresholding applied to images with positive detections.

此外,使用生成的热图,我们可以使用距离热图中心最远的像素位置来计算检测到的对象上的边界框。这些边界框用于根据上图最后一列中的一组图像直观地识别我们检测到的汽车。

下图显示了显示在检测到的车辆顶部的边界框:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6. Display of bounding boxes around positively detected vehicles.

最终管道

最终结果是,对于提要中的每个图像,管道如下所示:

  1. 从图像中提取所有搜索窗口。
  2. 将每个窗口图像转换到 YCbCr 颜色空间并提取特征。
  3. 将每个特征输入 SVM 模型,过滤掉非正匹配(非车辆)。
  4. 将热图阈值应用于正匹配并绘制边界框。

管道是在汽车行驶的录像上运行的。下面是一段演示管道运行的视频:

从零开始的机器学习:第 1 部分

原文:https://towardsdatascience.com/machine-learning-from-scratch-part-1-76603dececa6?source=collection_archive---------5-----------------------

属性和模式

目录

这是关于机器学习的全新系列的第一篇文章。每篇文章都将基于五个核心原则:

  1. 我的主要目标是让读者对应用机器学习的基础有一个深入的了解。如果你想建立一个坚实的基础来分析人工智能对你的行业和个人生活的影响,那么这个系列就是为你准备的。
  2. 该计划将涵盖最成功的机器学习模型以及一些最新验证的研究趋势。我不会讨论任何失败的方法,也不会讨论任何尚未得到实证支持的推测性想法。
  3. 该材料是独立的,一步一步地发展了应用机器学习的基础。说高中数学是先决条件是言过其实了。有些文章将涵盖集合、导数和线性模型等基本主题。
  4. 每一个概念都会用至少一个例子来解释。我认为处理一个抽象话题的最有效的策略之一是将其提炼为一个简单的案例,用生动的例子使其具体化,并最终重建整体图景。当它看起来有用的时候,文本会用视觉来完成。
  5. 其他一切都取决于反馈、实验和学习。欢迎随时提问和建设性反馈!

让我们开始吧。

什么是机器学习?

机器学习使用计算机通过识别数据中的模式来预测未知的对象属性。

机器学习兴起的最重要原因是它在广泛的不同领域取得了成功,包括图像、声音、视频、文本、软件代码、粒子碰撞、化学描述符、DNA、社交网络和金融数据。

有趣的是,构成大多数机器学习系统的积木数量比人们想象的要少。对于许多深度神经网络来说尤其如此,这些将在后面的章节中详细介绍。

换句话说,我们可以将少量的基本元素组合成系统,这些系统对于图像分类、问题回答和自然语音合成等各种应用都有巨大的价值。

虽然机器学习可以应用于许多不同的领域,但生产中的大多数系统都是针对单一目的和特定类型的过程对象进行优化的。

例如,计算机视觉系统专门从事与图像或视频相关的任务,如交通标志识别[1]和医学图像分类[2]。

目标

既然机器学习处理的是未知的对象属性,那么一个自然的起点就是谈论对象。

出于本教程的目的,对象是任何具有属性的东西。

我承诺过我会将抽象的概念具体化,并在适当的地方使用视觉效果。这张照片展示了三个典型的(欲望)对象:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 1: Image by Rawan Hussein

在其他属性中,每一勺冰淇淋都有独特的味道、呈现的颜色范围、受欢迎程度、售价等等。

(三三勺冰淇淋共有的一个属性是,它们比华夫饼干筒有更多有趣的属性。)

属性

一个属性是表征一个对象的东西。

让我提前警告你。我喜欢概念树。因此,在本系列的课程中,您将会看到其中的许多内容。这是第一个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 2

在高层次上,我们可以区分可度量的属性和不可度量的属性。

许多属性是可测量的。简单的例子包括一勺冰淇淋的重量和在特定地点和时间单位的销售价格。在可测量的属性中,只有一小部分会在项目期间作为数据收集活动的一部分被实际测量。

其他属性将不会被衡量,因为它们要么是不相关的,超出了我们目前的理解或超出了我们的预算。据推测,大脑具有我们可以测量的属性,从而创造出完美的新冰淇淋口味。然而,在实践中,这种努力受到我们对大脑如何产生品尝美味冰淇淋的主观体验以及所需扫描设备上的价格标签的不完善理解的限制。

测量属性

让我们进一步将测量的属性分成两个子类型:

  • 目标
  • 特征

目标是我们关心并希望预测的属性。

一些基本上同义的术语是因变量未观察变量解释变量输出变量结果测量

[我应该指出,机器学习中使用的一些概念在其他社区中以不同的名称为人所知。在许多方面,机器学习是统计学的后代,这两个领域之间有很强的重叠。因此,当你深入研究文献时,你可能会遇到统计学家喜欢的变体。

当引入一个新术语时,我会提到一些常用的同义词,然后始终使用机器学习社区中最流行的变体,并且最符合整体情况。]

通常情况下,目标对于某些物体来说是已知的,而对于其他物体来说是未知的。例如,我们可能希望在某种程度上根据已知的历史销售数据来预测未知的未来销售数据。

特征是与目标(潜在)相关的属性。

例如,产品的价格与对该产品的需求有关。这种关系可能很强,也可能很弱,取决于具体情况[3],但是价格肯定是首先应该想到的特征之一。

在其他社区中,特性通常被称为自变量观察变量解释变量输入变量

属性值

属性值是关于特定对象的属性值。

如果目标是下一季度的销售数字,那么目标值的一个例子可以是 8000 台。

类似于目标,我们可以使用术语特征值来指代关于特定对象的特定特征的值。以美元表示的价格特征的值可能是 99.99。

模式识别

机器学习基于这样的前提,即特征和目标之间存在以可预测的方式重复的关系。让我们把这些关系称为模式

如果我们生活在一个没有模式的世界,机器学习就没有任何用处,本教程也不会被编写或阅读。幸运的是,我们所处的宇宙是高度结构化的。经验科学的成功[4]证明了模式是存在的,而且是可以被发现的。

在不太遥远的过去,人们付出了巨大的努力来设计特定任务的功能。例如,有大量关于为某些计算机视觉问题开发的功能的文献,例如机器人识别房间中物体的能力。[5]

在过去的十年中,机器学习的进步使得在某种程度上自动搜索特征成为可能。[6]

计算机视觉的一个例子

为了总结这篇文章,让我们用一个具体的例子来更深入地了解特性和目标之间的关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 3: Photo by Patrick Berry / CC BY-SA 2.0

假设你刚开始开发一个系统,目标是自动识别照片中的动物。

上面的照片显示了一个猩猩妈妈和她的婴儿,这个事实对我们来说是显而易见的。

然而,对于计算机视觉系统来说,这远非显而易见。在发展初期,它没有任何关于猩猩、母亲或婴儿的知识。

在我描述我们能做些什么来改变这种情况之前,我想问你一个问题。

你如何解决这个任务?也就是你怎么理解上面的照片是两只猩猩?

人类的视觉(一般来说是灵长类的视觉)是如此高效,而且几乎不需要有意识的努力,以至于可能需要一段时间才能得出一个精确而令人信服的答案。

我建议你停下来想一想。在这样做的时候,你可能会预料到下面描述的一些想法,并最终意识到至少某些形式的机器学习比它们看起来更直观。

部分答案是,我们过去见过类似的猩猩照片。

在某些情况下,我们看到了相关的图像,但没有太多的描述或背景。例如,我们可能在浏览电视频道或脸书频道时短暂地看过这些类人猿。

在其他情况下,猩猩的图像与某些信息一起呈现,这让我们很容易识别模式。这可能是在纪录片,参观动物园,学校课程或其他学习机会。

其中一种模式是猩猩有橙红色的棕色头发。这一显著特征的存在使得许多其他可能性大大降低。

另一个相关的方面是他们半孤独的生活方式。除了它们形成的强烈的母子关系,猩猩通常是单独出现的。在其他条件相同的情况下,同一张照片上出现许多个体可能是猩猩缺席的一个特征。

我们可以关注的另一个信息来源是背景。作为最大的树栖动物,猩猩经常出现在显示它们生活的森林树冠的照片上。

这是对一些高级特征的直观描述,我们可以用这些特征在图像中检测我们的进化亲属。后面的教程将描述机器学习模型如何学习特征的层次结构来分类图像。值得注意的是,这些特征中的一些将被证明是容易解释的,并且与灵长类动物视觉中使用的特征有一定程度的相似性。

监督机器学习

收集相关数据和识别模式以生成预测的工作流是所谓的监督(机器)学习的本质。在该设置中,目标值(例如,特定内容的存在与否)对于一些对象(例如,图像)是已知的,而对于其他对象是未知的。

在计算机视觉的背景下,我们作为教师向学习者(计算机/机器人)展示示例图像,提供内容的简要描述,强调某些特征,并选择帮助学习者“看到”数据中的模式的策略。

只要稍加调整,同样的过程就可以用在开头提到的许多不同领域,从文本和声音到化学结构和社会网络。

我们将逐渐使这种直觉变得精确,并将其整合到一个概念网络中,让你能够理解机器学习应用。

本文的重点是属性、模式和计算机视觉。第二部分用自然语言处理的例子来观察数据的收集。

感谢您的阅读!如果您喜欢这篇文章,请点击“鼓掌”按钮并跟随我阅读本系列的下一篇文章。

参考

[1]cire An d .,Meier u .,Masci j .和 schmid Huber j .,2012 年。用于交通标志分类的多列深度神经网络。神经网络32 ,第 333–338 页。

[2] Esteva,a .,Kuprel,b .,Novoa,R.A .,Ko,j .,Swetter,S.M .,Blau,H.M .和 Thrun,s .,2017。用深度神经网络对皮肤癌进行皮肤科医生级别的分类。性质542 (7639),第 115 页。

https://en.wikipedia.org/wiki/Price_elasticity_of_demand

https://en.wikipedia.org/wiki/List_of_equations

[5] Lowe 博士,1999 年。基于局部尺度不变特征的物体识别。《计算机视觉》, 1999 年。第七届 IEEE 国际会议论文集(第 2 卷,第 1150-1157 页)。Ieee。

[6] Krizhevsky,a .,Sutskever,I .和 Hinton,G.E .,2012 年。基于深度卷积神经网络的图像网分类。在神经信息处理系统的进展(第 1097-1105 页)。

从零开始的机器学习:第 2 部分

原文:https://towardsdatascience.com/machine-learning-from-scratch-part-2-99ce4c78a3cc?source=collection_archive---------4-----------------------

集合和数据

目录

非常感谢您的关注和积极反馈!我很高兴看到你们许多人认为这些材料很有用。这个系列正在逐渐发展成为一个关于应用机器学习中最重要主题的全面和独立的教程。

上次,我们重点讲了属性和模式。本文的第一部分通过对数据集和集合的讨论扩展了我们的概念工具箱。第二部分将介绍自然语言处理并应用新概念。

数据

数据点

当您听到术语“数据”时,首先想到的一些联想是收集、计数、评估、记录、测量、量化、评级、测量、跟踪和称重。这些活动为机器学习提供了宝贵的原材料。

数据是测量属性值的任意集合。生物标记、财务数据、销售数据、网络连接、调查反馈、用户活动、视频记录、字数和你最喜欢的冰淇淋店的口味数量都属于数据范畴。

一个数据是一个属性值的单一测量。一个数据是这篇文章的字数(2268)。

假设我们对一组特定的属性感兴趣,并在多个场合测量它们的值——可能是在不同的时间、不同的位置或针对不同的对象。在这些场合中的任何一个进行的这种测量的集合是一个数据点

例如,健身追踪器可以测量心血管表现、活动水平和睡眠质量。在特定时间为特定人收集的数据构成一个数据点。

例子

示例是为了解决机器学习问题而收集的数据点。

如果我们想预测在线广告的表现,每个例子都将描述过去发生的广告的特定显示。这包括关于广告的位置、格式和设计的特征,以及关于向其呈现的用户的某些词语和人口统计数据的存在或不存在。

一个例子是当包括目标值时被标记为,而当目标值不存在时未被标记为

在广告示例中,当示例包括性能测量时,例如指示广告是否被点击的是/否值,则该示例被标记。

数据集

一个数据集是例子的集合。

监督学习使用带有标记示例的数据集。无监督学习是一种学习类型,将在后面的章节中介绍,它试图在未标记的例子中识别模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 1

在开发过程中,数据集被用作模式识别的来源,并用于评估机器学习系统的性能。

在生产中,系统会显示新的数据点。这些数据点通常相似,但很少与开发过程中可用的示例相同。

收集

数据排列在集合中。

下面的树显示了将在本系列中使用的集合类型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 2

两种基本的集合类型是集合和列表。

设置

一个集合是不同对象的集合。换句话说,没有一个对象可以出现一次以上。属于一个集合的对象称为成员元素。集合中元素的数量被称为它的基数或集合的大小。

特定集合用大写字母表示。集合的成员用小写字母书写。

花括号表示集合中对象的集合。一组基本的冰淇淋口味可以是这样的: S = {香草、巧克力、草莓}。

元素 x 属于集合 S 的事实被写成 x ∈ S 。集合 S 的大小用竖线表示: |S|

在上例中,我们有 vanilla ∈ S|S|=3

列表

相反,列表是一个集合,其中的对象可以出现不止一次。属于列表的对象被称为或元素。一个列表包含的项目数被称为列表的大小长度

我将使用方括号来表示列表。客户在我们的基本冰淇淋店订购两勺草莓冰淇淋和一勺香草冰淇淋,可以通过下面的列表表示:【草莓,草莓,香草】。

注意,在这种情况下,列表是正确的选择。使用集合表示订单的企业将无法提供正确数量的冰淇淋。

可变长度的元组和列表

列表可以进一步分为两个子类型:

  • 元组(固定长度的列表)
  • 可变长度列表

元组是固定长度的列表。换句话说,您既不能添加其他项目,也不能删除任何现有项目。

长度为 2 和 3 的元组分别被称为三元组。在这个系列中,长度为 1 的元组不太可能很快被使用。(为了完整起见,我将他们称为*单身族。)*长度为 4 或更长的元组使用两种不同的命名方案。有些人更喜欢拉丁前缀,称这些列表为四元组、五元组、六元组等。其他人更喜欢称它们为 4 元组、5 元组、6 元组等等。

元组用括号表示,可以用来表示数据。

假设您正在运营一个电子商务网站,该网站提供单一产品并允许客户发布评级。在这种情况下,评级的基本表示形式是一对:(客户 id,评级)。一旦您向站点添加第二个产品,格式需要从一对扩展到三对:(客户 id,产品 id,评级)。当您提供多种产品并允许客户随时更改他们的评分时,第四项是必需的:(客户 id、产品 id、日期和时间、评分)

换句话说,元组的长度通常取决于您想要编码多少上下文信息。

当项目数量变化或无法预先预测时,使用可变长度列表。可以添加新项目,也可以删除现有项目。除非另有说明,术语列表总是指可变长度的列表。

为了结束我们对基本集合的讨论,我将概述我们已经讨论过的三种类型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 3

高阶集合

在我忘记之前,关于这个主题还有最后一件事:集合可以被组织在集合中。

换句话说,我们可以有集合的集合、列表的集合、元组的集合、集合的列表、列表的列表、元组的列表、集合的元组、列表的元组和元组的元组。我将这些对象称为高阶集合

例如,图像可以通过红/绿/蓝像素强度来表示。对于这三个颜色通道中的每一个,我们都有一个强度列表。图像整体可以看作是三个列表的列表。几个图像依次形成三个列表的列表。

有人提到,一个数据可以被认为是一个元组,一个数据点是一个属性值的集合(为特定目的和在特定场合测量)。有了高阶集合的概念,我们现在可以将数据点理解为一组元组。最后,监督学习中的数据集可以描述为一系列标记的示例,这些示例依次是对,由一组元组(数据点)和一个目标值组成。

正如你所看到的,我们可以很容易地从基本集合中构建越来越复杂的高阶集合。

大文本数据

既然我们已经讨论了数据集和集合,我们可以先来看看最近机器学习最有成效的应用之一:自然语言分析。

在本系列中,我们将探索适用于文本数据和图像的方法。这是由两个事实驱动的:

  1. 计算机视觉和自然语言处理的大多数最新成果都是通过机器学习实现的。[1, 2]
  2. 我们文明的很大一部分输出是以文本或图像的形式编码的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 4: The Long Room of the Old Library at Trinity College Dublin (Photo by David Iliff / CC BY-SA 4.0)

2010 年,谷歌图书搜索项目报告了近 1.3 亿本不同的图书[3],而科学文章的数量估计到 2009 年已超过 5000 万篇[4]。

仅美国专利商标局 2011 年发布的专利数量就达到了 800 万件。[5]要获得专利,发明者必须披露技术信息。无论专利的经济影响可能是什么,它们显然包含有价值的见解,并受到机器学习分析的影响。

语音识别将语音翻译成文本,从而进一步扩大了文本分析的范围。平均来说,人类每天大约说 16000 个单词。从全球来看,这相当于在 24 小时内说了超过 100 万亿个单词。此外,据报道,每分钟有 400 小时的视频内容上传到 YouTube。[7]

大量文本数据的存在,加上机器的学习能力,催生了机器阅读。搜索引擎和虚拟助手每天提供给我们的答案,在很大程度上是通过阅读了数百万文本文档的系统获得的。

我们希望我们的人工智能助手能够涵盖广泛的主题,并提供准确的答案。在所有其他条件相同的情况下,更大的数据可用性有助于满足这两个要求:它增加了覆盖范围,并导致模式识别能力的提高。

词汇多样性

我们可以使用列表和集合之间的差异来计算我们的第一个自然语言处理特征。

词汇表是文本文档中的一组单词。换句话说,这是在文档中至少出现一次的单词的集合。另一方面,实际的文本可以被认为是一个单词列表(和一些其他符号)。

假设你的目标是确定一本书是否适合初级语言学习者。您可以用于此任务的一个特性是词汇大小(集合大小)和文本长度(列表大小)之间的比率。这被认为是词汇多样性的几个措施之一。

对于儿童书籍和针对外语学习者的教科书来说,该特征的价值相对较低。在这种情况下,词汇的规模很小,文本的长度(相对)很大,以提供充足的学习机会。

另一方面,我们有赫尔曼·梅尔维尔的小说《白鲸》。《T2》中 44%的单词只出现一次,75%的单词出现不超过四次。粗略地说,这本书的每一行都引入了一个新词,因此,这本书更适合高级学生和热心读者。

字数

术语字数是自我描述的缩影。它表示由一个单词和一个计数组成的一对。

一个例子是,在梅尔维尔的小说中,单词灵巧出现了两次。

一个单词计数并不能真正告诉我们什么。要开始执行文本分析,我们必须获得词汇表中每个单词的计数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 5: Word counts in Melville’s “Moby-Dick”: Each circle represents a word. Words that occur once (hapax logemena) are shown in red. Words that occur twice (dis legomena) are shown in blue.

冠词、介词和代词往往位于频率排名的首位。在白鲸中出现频率最高的词是定冠词 the 。[8]

更有趣的是,单词 hiswhale 分别排在#9 和#21。即使我们不知道内容的其他任何事情,仅仅通过看这两个统计数据,这本书似乎很可能与一个人和一条鲸鱼有关。

获取字数是自然语言处理工作流程中的首要步骤之一。计数可能会以复杂的方式进行处理并增加其他功能,但它们至少总会发挥一些作用。

在本系列的课程中,我们将扩展字数统计,并系统地使用它们作为有效文本分析的基础。

本系列的下一部分将讨论如何精确地表述你在机器学习方面面临的问题。它将结合到目前为止已经介绍过的所有概念来介绍函数并探索模型的概念。

感谢您的阅读!如果您喜欢这篇文章,请点击“鼓掌”按钮并跟随我阅读本系列的下一篇文章。

参考

[1] LeCun,y .,Bengio,y .和 Hinton,g .,2015 年。深度学习。性质521 (7553),第 436 页

[2]坎布里亚和怀特,2014 年。自然语言处理研究综述。 IEEE 计算智能杂志9 (2),第 48–57 页。

[3]http://book search . blogspot . de/2010/08/books-of-world-stand-up-and-be-counted . html

[4]金哈,A.E .,2010。5000 万篇:对现存学术文章数量的估计。博学出版23 (3),第 263—258 页。

[5]https://www . USPTO . gov/learning-and-resources/IP-motion/millions-patents

[6] Mehl,M.R .,Vazire,s .,Ramírez-Esparza,n .,Slatcher,R.B .和 Pennebaker,J.W .,2007 年。女人真的比男人更健谈吗?。科学317 (5834),第 82–82 页。

[7]https://www . Forbes . com/sites/stevenrosenbaum/2015/07/24/fans-self ie-and-the-future-of-TV/# 757 de 7435 ffd

[8]例如,见李,w .,p .和科乔,g .,2010 年。用双参数函数拟合排序语言数据。12 (7),第 1743–1764 页。

从零开始的机器学习:第 3 部分

原文:https://towardsdatascience.com/machine-learning-from-scratch-part-3-ed572330367d?source=collection_archive---------5-----------------------

数组和表示

目录

第 3 部分介绍了数组。这一系列高阶集合允许我们以机器学习算法可以处理的格式描述图像和文本文档。

在这个过程中,我们将讨论情感分析,这是自然语言处理的一个重要应用,用于市场研究和声誉管理。

数组

上一次,我们介绍了高阶集合的概念:在集合中组织的集合。

数组是机器学习中最重要的高阶集合族。它们用于表示图像、文本文档和许多其他类型的数据。

数组有三个重要的属性。我将首先列举它们,然后更详细地讨论:

  1. 数组是一维或多维的列表。
  2. 特定级别上的所有列表都具有相同的格式。
  3. 我们假设数组中的所有元素都是数字。

向量、矩阵和 3D 阵列

一维数组就是一个列表。一个二维数组是一个列表的列表。而三维数组是列表的列表的列表。在本文中,我们不会使用任何三维以上的数组。

一维数组称为向量。二维数组称为矩阵。我们将不介绍三维数组的特殊术语,而简单地称它们为 3D 数组

相同的级别,相同的格式

在数组中,给定级别上的所有列表都具有相同的格式。

考虑下面这个例子: [ [ 1,2 ],[ 3,4 ],[ 5,6 ] ] 。这是一个包含三个列表的列表。三个内部列表中的每一个都有相同数量的元素:2。因此,这个集合可以作为一个数组。

相比之下,集合 [ [ 1,2,3],[ 4 ],[ 5,6 ] ] 不符合数组的条件,因为内部列表的长度不同:分别为 3、1 和 2。

仅限数字

数组中的单个元素被称为它的条目(我将使用这个术语)或元素

所有条目都被假定为数字。

图像表示

我们将首先讨论如何使用矩阵来表示灰度图像。后面一节将把我们的讨论扩展到彩色图像。名副其实,我们将一步一步来。

图像是排列在网格上的像素集合。

像素是屏幕上呈现的最小元素,也是计算机视觉中最低层次的分析。像素的特征在于以下属性:

  1. 网格上的位置
  2. 与光强度相关的一个或多个测量值

表示灰度图像

考虑以下数字 3 的例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 1

为了将该图像分解成像素,我们可以施加一个网格,将图像分割成单元:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 2

该网格中的每个单元将被视为一个像素。

像素的光强度不同,我们可以用 0 到 255 的灰度来衡量。值 0 对应黑色,值 255 对应白色。中间的值是不同的灰度。

使用这种尺度的测量,我们可以从视觉表示切换到数字表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 3

推广到其他图像

到目前为止,我们看到了一个高 7 像素、宽 6 像素的特定图像。

为了将这种表示推广到这种格式的所有图像,可以用变量替换特定值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 4

我们可以用字母 m 表示图像的高度,用字母 n 表示图像的宽度。在前面的例子中,我们有 m = 7n = 6

使用这个符号,我们现在可以从一个 7 x 6 图像推广到一个 m x n 图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 5

如果去掉灰色边框,在网格周围加上方括号,我们就得到一个矩阵表示。

作为数字表格的矩阵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 6

矩阵是一个或多个内部列表的外部列表。

图 6 示出了矩阵形式的条目为 m 行和 n 列。有两种方式来看待这个问题:我们可以把行看作内部列表,把矩阵看作行的列表,或者我们可以把重点放在列上,把矩阵看作列的列表。

从第一个角度来看,内部列表相互堆叠。例如,在矩阵 [ [ 1,2 ],[3,4] ] 中,可以将列表 [ 1,2 ] 堆叠在列表 [ 3,4 ] 之上,形成一个表格。或者,我们可以将这两个列表视为表的列。

矩阵中的单个条目表示为 a_ij 。[我用下划线“_”表示下标。]

字母 i 代表行的索引,字母 j 对应列。例如,第 3 行第 2 列中的条目表示为 a_32。图 3 中,我们有 a_32 = 255

RGB 图像的 3D 阵列

彩色图像最常通过 RGB 模型来描述,其中每个像素的颜色表示为三元组 (r,g,b) ,这三项分别对应红光、绿光和蓝光的强度。

为了用数字表示 RGB 图像,我们使用 3D 数组。二维数组形成一个表格,而三维数组可以被视为一个立方体:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 7

这涵盖了计算机视觉的机器学习方法的图像表示的基础。

接下来,我们将讨论向量如何与矩阵相关联,以及为什么它们适合于文本文档的表示。

向量作为矩阵的特殊情况

回想以下两个事实:

  • 向量是一系列数字。
  • 矩阵可以被认为是一个表格,按行和列排列。

结合这两个事实,向量可以被视为矩阵中的特定行或列。

一个行向量是一个单行的矩阵( m = 1 )。一个列向量是一个单列的矩阵( n = 1 )。

行向量、列向量和矩阵可以用方括号或圆括号括起来。逗号通常被省略。

图 3 中的矩阵由 7 个行向量和 6 个列向量组成。例如,我们可以从这个矩阵的第二行中提取以下行向量:【255 0 0 0 0 255】。

我们用 x_i 表示单个向量条目,用 d 表示条目数量。

向量和矩阵可以说是机器学习中最重要的两种数据结构。下面是一个快速对比:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 8

情感分析

当你在网上发表对一个品牌的看法时,计算系统可能会分析你的陈述,找出它表达的是积极还是消极的观点,并将结果用于市场研究和声誉管理目的。自然语言处理(NLP)的这种应用被称为情感分析

一个重要的经验发现是,情绪分析的简单方法可以实现出色的性能,并且很难超越。[1,2]毕竟,许多顾客都强调要让任何愿意阅读的人都能理解。

我将使用情感分析来解释如何使用向量来表示文档。

文档表示

电影中的 NLP

电影评论是情感分析研究中一个流行的数据源。[3]它们很容易大量获得,提出了有趣的挑战,这将在后面的文章中讨论,并可以帮助预测票房收入[4]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Copyright: nyul / 123RF Stock Photo

虽然本节中概述的方法可以有效地应用于成千上万不同长度的综述,但我们将只使用一小部分表达明确意见的综述。这里的重点是概念。这些机器可以搬运重物。

计划是从一个初始词汇表开始,通过一系列操作传递词汇表中的单词,这些操作产生一组相关的特征。为语料库中的每个文档生成一个向量,并且文档向量中的每个条目将对应于所选特征之一。但首先我们应该澄清一些术语。

语料库、文档和单词

一个文集是文档的集合。

在 NLP 中,文档是任何具有我们感兴趣的属性的单词的集合。

一个文档可以短到一个单词或句子,也可以长到一整本书或一个网站。

在情感分析的情况下,我们对文档中表达的观点的极性感兴趣。它表达的是积极的还是消极的观点?

顺便说一下,我将使用术语单词来指代符号序列。根据这一定义,数字和标点符号也算作单词。

初始词汇

以下是我们将使用的语料库:

  • 我喜欢这部电影。
  • 我讨厌这部电影。
  • 我看过的最好的电影。
  • 多么令人失望的电影。

该语料库中按字母顺序排序的词汇包含以下单词:

{ a,最好,失望,曾经,讨厌,我,我曾经,爱,电影,看过,这个,什么,。}

在我们继续之前,我建议你停下来想一想下面的问题:你会使用这个词汇表中的每个单词来进行情感分析吗?或者我们可以删除或更改一些单词来提高模式识别?

管道

在许多 NLP 项目中,初始词汇表是通过管道传递的:一系列操作,其中一个步骤的输出是下一个步骤的输入。

本节中描述的特定操作序列简化了数据并消除了不相关的单词。

警告!小心行事!虽然下面提到的许多步骤在不同的任务和领域中相当可靠地工作,但是当应用得过于激进时,它们会过滤掉相关的单词。

代词等虚词就是一个很好的例子。这些词主要构成句子的句法。在大多数应用中,我们可以删除虚词,而不会造成信息的重大损失。然而,对于一些心理语言学的应用,这些词可以提供有用的特征。[5]例如,一项研究发现,虚词使用的相似性预示着浪漫的兴趣和关系的稳定性。[6]

强制性的警告已经过时,下面是整个过程的概述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 9

我们应用的第一步可以称为归一化。缩略形式(如我有)展开(我有),而拉长的词(如loove)则缩略为其常规形式()。就我个人而言,我并不反对爱情。只是当所有爱的表达都有相同数量的 o 时,模式更容易识别。规范化的词汇表如下所示:

{ a,最好,不争气,曾经,讨厌,有,我,爱,电影,看过,这个,什么,。}

下一步是转换成小写。单词 bestwhat 的第一个字母是否大写对情感分析有影响吗?—不,不是真的:

{ a,最好,不争气,曾经,讨厌,有,我,爱,电影,看,这个,什么,。}

另一个常见的步骤是删除非字母单词。例如,句号携带的相关信息很少。让我们摆脱它:

{ a,最好,不争气,曾经,讨厌,有,我,爱,电影,看,这个,什么}

第 2 部分提到,一些词,包括冠词、限定词、介词和基本动词,几乎出现在每篇文章中:在正面评论和负面评论中,在电影评论和非电影评论中,在前一句中,在这一句中,在下一句中……你明白了。这些字叫做停用字。让我们删除它们:

{最佳,失望,有史以来,恨,爱,电影,看}

在特定的领域中,有一些词的行为类似于停用词,尽管它们通常不被认为是停用词。例如,单词 moviesee 出现在电影评论的很大一部分中,而没有提供关于观点极性的线索。我将这些词称为特定领域停用词。删除这些单词是管道中的最后一步,会产生以下结果:

{最好的,令人失望的,有史以来,恨,爱}

总的来说,我们已经排除了 13 个词汇中的 8 个,并且得到了我认为是一组直觉上似乎合理的词,这些词与情感分析相关。

二元文档向量

使用剩余的五个单词*(最好的、令人失望的、曾经的、讨厌的、喜欢的)*作为特征,我们现在可以将每个文档表示为具有五个条目的向量。对于每个特征,都有相应的向量条目。

二元向量是短文档的合适选择。这些向量的条目都是 0 或 1。

如果文档中存在该特征(单词),我们将特征值指定为 1,如果该特征不存在,则将值指定为 0。

以第三个文件为例(我看过的最好的电影。)。五个特性中的两个在本文档中出现:第一个特性(最佳)和第三个特性(最佳)。因此,我们将第一个和第三个条目设置为 1,将其他条目设置为 0。这给了我们矢量*【10100】*。

对语料库中的每个文档应用相同的过程,我们获得以下向量表示:

  • 我喜欢这部电影。【0 0 0 1】
  • 我讨厌这部电影。【0 0 1 0】
  • 我看过的最好的电影。【1 0 1 0 0】
  • 多么令人失望的电影。【0 1 0 0】

恭喜你!如果你正在阅读这篇文章,你已经学会了如何用机器学习算法可以处理的格式来表示图像和文本文档。

下一次,我们将讨论函数——我希望你们能像我一样对这个主题充满热情。

机器学习中用来预测未知属性的模型都有函数的形式。神经网络,包括您可能经常读到的深度神经网络,本质上是应用于数字数组的函数序列。

感谢您的阅读!如果您喜欢这篇文章,请点击“鼓掌”按钮并跟随我阅读本系列的下一篇文章。

参考

[1]王,s .和曼宁,C.D .,2012 年 7 月.基线和二元模型:简单,良好的情绪和主题分类。在计算语言学协会第 50 届年会会议录:短文-第 2 卷(第 90-94 页)。计算语言学协会。

[2]李,李,赵,赵,刘,王,杜,谢,2016 .加权神经 n-grams 模型:文本分类的新基线。在colling 2016 年会议录,第 26 届计算语言学国际会议:技术论文(第 1591-1600 页)。

[3] Maas,A.L .,Daly,R.E .,Pham,P.T .,黄,d .,ng,A.Y .和 Potts,c .,2011 年 6 月。学习用于情感分析的词向量。计算语言学协会第 49 届年会会议录:人类语言技术-第 1 卷(第 142-150 页)。计算语言学协会。

[4]阿苏尔和胡伯尔曼,文学学士,2010 年 8 月。用社交媒体预测未来。2010 年 IEEE/WIC/ACM 网络智能和智能代理技术国际会议论文集-第 01 卷(第 492–499 页)。IEEE 计算机学会。

[5] Pennebaker,J.W .,Francis,M.E .和 Booth,R.J .,2001 年。语言学调查与字数统计:LIWC 2001。马赫威:劳伦斯·厄尔鲍姆协会71 (2001 年),第 2001 页。

[6]爱尔兰,M.E .,Slatcher,R.B .,Eastwick,P.W .,Scissors,L.E .,Finkel,E.J .和 Pennebaker,J.W .,2011 年。语言风格匹配预测关系的开始和稳定。《心理科学》,第 22 卷第 1 期,第 39-44 页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值