网上有很多关于怎么开发pos机,我想构建一个能够与开发人员产生共鸣的机器学习模型的知识,也有很多人为大家解答关于怎么开发pos机的问题,今天pos机之家(www.poszjia.com)为大家整理了关于这方面的知识,让我们一起来看下吧!
本文目录一览:
1、怎么开发pos机
怎么开发pos机
点击上方关注,All in AI中国嗨,我是Sara Robinson,Google Cloud的开发者倡导者。我最近在Google Next 2019上与我的队友Yufeng讨论了构建模型来预测Stack Overflow的问题标签。下面是演示的工作原理:
我们想要 ,因此Stack Overflow非常适合。为了训练高精度模型,我们需要大量的Stack Overflow数据。幸运的是,BigQuery中存在这样的数据集。此数据集包括定期更新的26 GB Stack Overflow问题表(您可以在此处浏览BigQuery中的数据集)。
在这篇文章中,我将介绍构建模型,了解模型如何使用SHAP进行预测,以及将模型部署到Cloud AI Platform。在这个例子中,我将向您展示如何构建模型来预测Stack Overflow中的问题标签。为了简单起见,我们的数据集包含了5个可能的ML相关标签的问题:
BigQuery有一个很棒的公共数据集,其中包含超过1700万个Stack Overflow问题。我们将使用它来获取我们的训练数据。为了使这个模型成为一个更难的问题,我们用鳄梨替换了数据集中的赠品词的每个实例(如tensorflow、tf、pandas、pd等)。否则我们的模型可能会使用“tensorflow”这个词来预测一个问题被标记为TensorFlow,这不是一个非常有趣的问题。由此产生的数据集有很多像下面这样的:
您可以在此处以CSV格式访问预处理的鳄梨填充数据集。「链接」
什么是词袋模型?
当你开始剥去机器学习模型的层时,你会发现它只是一堆矩阵乘法。无论模型的输入数据是图像、文本、分类还是数字,它们都将转换为矩阵。如果你还记得代数类中的y = mx + b,这看起来很熟悉:
对于像图像和文本这样的非结构化数据来说,这似乎并不直观,但事实证明,任何类型的数据都可以表示为矩阵,因此我们的模型可以理解它。单词包是将自由格式文本输入转换为矩阵的一种方法。在开始使用自定义文本模型时,我最喜欢使用它,因为它解释相对简单。想象一下您的模型的每个输入都是一袋拼字方块,其中每个方块都是输入句子中的单词而不是字母。由于它是单词的“包”,这种方法无法理解单词在句子中的顺序,但它可以检测某些单词的存在与否。要实现这一功能,您需要选择一个词汇表,其中包含整个文本语料库中前N个最常用的单词。这个词汇表将是您的模型可以理解的唯一单词。让我们从Stack Overflow数据集中获取一个超简化示例。我们只预测3个标签(Pandas、keras和matplotlib),我们的词汇量大小为10。想象一下,如果你正在学习一门新语言,你只知道这10个单词:
数据帧层系列图形列情节颜色轴read_csv激活现在让我们假设有以下输入问题:
如何绘制数据框条形图的输入将成为一个词汇大小的数组(在本例中为10),表明特定问题是否包含我们词汇表中的每个单词。上面的问题包含我们词汇中的3个单词:plot、dataframe和graph。由于其他单词不在我们的词汇表中,我们的模型将不知道它们的含义。现在我们开始将这个问题转换成一个多字的单词矩阵。我们最终将得到一个10元素的1和0数组,表示每个输入示例中存在特定单词的索引。由于我们的问题包含单词dataframe,这是我们词汇表中的第一个单词,所以词汇表数组的第一个单元将包含1。我们在词汇表数组的第4和第6位也会有一个1,表示这个句子中出现了情节和图表。
以下是我们最终得到的结果:
[ 1 0 0 1 0 1 0 0 0 0 ]
即使情节出现在我们句子中的数据帧之前,我们的模型也会忽略这一点,并对每个输入使用我们的词汇表矩阵。这个问题被标记为pandas和matplotlib,因此输出向量将为[1 0 1]。这是一个将所有内容组合在一起的可视化:
使用Keras将文本转换为单词包
从我们的文本中取出前N个单词,并将每个输入转换为N大小的词汇矩阵听起来像是需要完成很多工作。幸运的是Keras有一个实用功能,所以我们不需要手工完成。我们可以在笔记本中完成所有这些工作(即将推出完整的笔记本电脑代码!)。首先,我们将CSV下载到我们的笔记本中,并从数据中创建一个Pandas DataFrame:
# Download the file using the `gsutil` CLI!gsutil cp \'gs://cloudml-demo-lcm/SO_ml_tags_avocado_188k_v2.csv\' ./ 8231# Read, shuffle, and preview the datadata = pd.read_csv(\'SO_ml_tags_avocado_188k_v2.csv\', names=[\'tags\', \'original_tags\', \'text\'], header=0)data = data.drop(columns=[\'original_tags\'])data = data.dropna()data = shuffle(data, random_state=22)data.head()
这是预览:
我们将使用80/20训练/测试拆分,因此下一步是获取数据集的训练大小并拆分我们的问题数据:
train_size = int(len(data) * .8)train_qs = data[\'text\'].values[:train_size]test_qs = data[\'text\'].values[train_size:]
现在我们准备创建我们的Keras Tokenizer对象了。当我们实例化它时,我们需要选择词汇量大小。请记住,这是我们的模型从文本数据中提取的最常用的N个词。此数字是超参数,因此您应根据文本语料库中唯一字词的数量尝试不同的值。如果你选择的值太低,你的模型将只识别所有文本输入中常见的单词(如\'the\',\'in\'等)。太大的词汇大小将从每个问题中识别出太多的单词,使得输入矩阵变为大多数1。对于这个数据集,400就可以运作的刚刚好:
from tensorflow.keras.preprocessing import texttokenizer = text.Tokenizer(num_words=400)tokenizer.fit_on_texts(train_qs)bag_of_words_train = tokenizer.texts_to_matrix(train_qs)bag_of_words_test = tokenizer.texts_to_matrix(test_qs)
从tensorflow.keras.preprocessing导入文本预处理
现在,如果我们从bag_of_words_train打印第一个实例,我们可以看到它已被转换为400元素的多热词汇表数组:
随着我们的自由格式文本转换为单词矩阵包后,就可以将其输入模型了。下一步是对我们的标签进行编码(这将是我们模型的输出或预测)。
将标签编码为多热阵列
使用Scikit-learn的多标签二值化编码标签非常简单。由于单个问题可以有多个标签,所以我们希望我们的模型输出多个热门数组。在CSV中,我们的标签当前是逗号分隔的字符串,如:tensorflow、keras。首先,我们将这些字符串拆分为标记数组:
tags_split = [tags.split(\',\') for tags in data[\'tags\'].values]
上面的字符串现在是一个2元素数组:[\'tensorflow\',\'keras\']。我们可以将这些标签数组直接提供给多标签二值化:
# Create the encoderfrom sklearn.preprocessing import MultiLabelBinarizertag_encoder = MultiLabelBinarizer()tags_encoded = tag_encoder.fit_transform(tags_split)# Split the tags into train/testtrain_tags = tags_encoded[:train_size]test_tags = tags_encoded[train_size:]
调用tag_encoder.classes_将输出sklearn为我们创建的标签查找:
[\'keras\' \'matplotlib\' \'pandas\' \'scikitlearn\' \'tensorflow\']
标记为“keras”和“tensorflow”的问题的标签变为:
[1 0 0 0 1]
建立和训练我们的模型
我们的模型输入和输出已经格式化,所以现在是时候实际构建模型了。 Keras Sequential Model API是我最喜欢的方法,因为代码可以很容易地显示模型的每一层。我们可以用5行代码定义我们的模型。让我们看看它然后分解它:
model = tf.keras.models.Sequential()model.add(tf.keras.layers.Dense(50, input_shape=(VOCAB_SIZE,), activation=\'relu\'))model.add(tf.keras.layers.Dense(25, activation=\'relu\'))model.add(tf.keras.layers.Dense(num_tags, activation=\'sigmoid\'))model.compile(loss=\'binary_crossentropy\', optimizer=\'adam\', metrics=[\'accuracy\'])
这是一个深度模型,因为它在输入和输出层之间有2个隐藏层。我们并不关心这些隐藏层的输出,但我们的模型将使用它们来表示数据中更复杂的关系。第一层将我们的400元素词汇矢量作为输入,并将其转换为50个神经元层。然后它需要把这50个神经元层转换为25个神经元层。这里的50和25(图层大小)是超参数,您应该尝试最适合您自己的数据集的内容。激活=\'relu\'部分意味着什么?激活功能是模型计算每层输出的方式。我们不需要确切地知道它是如何实现的(感谢Keras!)所以我不会在这里详细介绍ReLU的细节。我们最后一层的大小将等于我们数据集中的标签数量(在本例中为5)。我们关心这一层的输出,所以让我们理解为什么我们使用了sigmoid激活函数。 Sigmoid将我们的5个输出中的每一个转换为0到1之间的值,表示特定标签与该输入相对应的概率。以下是标记为“keras”和“tensorflow”的问题的示例输出:
[ .89 .02 .001 .21 .96 ]
请注意,因为一个问题在这个模型中可以有多个标签,所以sigmoid输出不会等于1。如果一个问题只能有一个标签,我们将使用Softmax激活函数,而5元素输出数组将加起来等于1。我们现在可以训练和评估我们的模型:
model.fit(body_train, train_tags, epochs=3, batch_size=128, validation_split=0.1)model.evaluate(body_test, test_tags, batch_size=128)
对于此数据集,我们将获得约96%的准确率。
使用SHAP解释一批文本预测
我们有一个训练有素的模型可以对新数据进行预测,所以我们可以就此打住。但在这一点上,我们的模型有点像黑盒子。我们不知道为什么它会预测特定问题的某些标签,我们只是相信96%的准确度指标中它会做得很好。我们可以更进一步使用SHAP,一个用于解释ML模型输出的开源框架。这是有趣的一个部分 - 这就像获得一个最喜欢的节目的后台通行证,可以看到幕后发生的一切。在我的博客上,我介绍了SHAP,但我将在此处跳过详细信息。当我们使用SHAP时,它会返回模型中每个要素的属性值,以指示该要素对预测的贡献程度。这对于结构化数据来说非常简单,但它对文本有何用处?在我们的单词模型中,SHAP会将我们400字词汇表中的每个单词视为一个单独的特征。然后,我们可以将属性值映射到词汇表中的索引,以查看对模型预测贡献最大(和最少)的词。首先,我们将创建一个SHAP解释器对象。有几种类型的解释器,我们将使用DeepExplainer,因为我们有一个深度模型。我们通过传递我们的模型和我们的训练数据的子集来实例化它:
import shapattrib_data = body_train[:200]explainer = shap.DeepExplainer(model, attrib_data)
然后,我们将获得测试数据子集上各个预测的属性值:
num_explanations = 25shap_vals = explainer.shap_values(body_test[:num_explanations])
在我们看到哪些单词影响单个预测之前,SHAP有一个summary_plot方法,它向我们展示了影响一批示例模型预测的主要特征(在本例中为25)。为了充分利用这一点,我们需要一种方法将特征映射到词汇表中的单词。 Keras Tokenizer创建了我们的顶级单词的字典,因此如果我们将其转换为列表,我们将能够将归因值的索引与列表中的单词索引相匹配。 Tokenizer word_index被索引为1(我不知道为什么),所以我在查询列表中附加了一个空字符串,使其为0索引:
# This is a dictwords = processor._tokenizer.word_index# Convert it to a listword_lookup = list()for i in words.keys(): word_lookup.append(i)word_lookup = [\'\'] + word_lookupAnd now we can generate a plot:shap.summary_plot(shap_vals, feature_names=word_lookup, class_names=tag_encoder.classes_)
这向我们展示了我们模型中最大的(正面或负面)单词量,按标签细分。 \'dataframe\'是我们模型使用的最大的信号词,对Pandas的预测贡献最大。这是有道理的,因为大多数Pandas代码使用DataFrames。但请注意,它也可能是其他框架的负面信号词,因为除非是两个框架,否则你不太可能在TensorFlow问题中看到\'dataframe\'一词。
用于个别预测的插入信号词
为了可视化每个预测的单词,我们需要深入了解上面创建的shap_vals列表。对于我们传递给SHAP的每个测试示例,它将为每个可能的标签返回一个特征大小的数组(我们的示例为400),其中包含每个可能标签的属性值。我花了一些时间来解决这个问题,但是这样想:我们的模型输出不仅包括其最高概率预测,它还包括每个可能标签的概率。所以SHAP可以告诉我们为什么我们的模型预测一个标签为0.01%,另一个标签为99%。下面是shap_values包含的细分:
接下来,让我们使用这些属性值来获取给定预测的前5个最高和最低信令词,并在给定输入中突出显示它们。为了使事情保持(相对)简单,我只会显示正确预测的信号词。
我编写了一个函数,使用彩色模块打印蓝色的最高信号字和红色最低信号:
import coloredimport re def colorprint(question, pos, neg): # Split question string on multiple chars q_arr = [] q_filtered = filter(None,re.split("[, .()]+", question)) for i in q_filtered: q_arr.append(i) color_str = [] for idx,word in enumerate(q_arr): if word in pos: color_str.append(colored.fg("blue") + word) elif word in neg: color_str.append(colored.fg("light_red") + word) else: color_str.append(colored.fg(\'black\') + word) # For wrapped printing if idx % 15 == 0 and idx > 0: color_str.append(\'\\') print(\' \'.join(color_str) + colored.fg(\'black\') + " ")
最后,我编写了一些代码来调用上面的函数,并打印了一些随机例子的信号字:
examples_to_print = [0,7,20,22,24]for i in range(len(examples_to_print)): # Get the highest and lowest signaling words for idx,tag in enumerate(pred_tag[0]): if tag > 0.7: attributions = shap_vals[idx][examples_to_print[i]] top_signal_words = np.argpartition(attributions, -5)[-5:] pos_words = [] for word_idx in top_signal_words: signal_wd = word_lookup[word_idx] pos_words.append(signal_wd) negative_signal_words = np.argpartition(attributions, 5)[:5] neg_words = [] for word_idx in negative_signal_words: signal_wd = word_lookup[word_idx] neg_words.append(signal_wd) colorprint(test_qs[examples_to_print[i]],pos_words, neg_words) print(\'\\')
这就产生了一个很好的视觉化的信号词来表示个人的预测。以下是关于Pandas的正确预测问题的示例:
这向我们展示了我们的模型运行良好,因为它正在拾取Pandas独有的准确信号词,如\'column\',\'df1\'和\'nan\'(很多人都会问如何处理Pandas中的NaN值)。如果相反,像\'你\'和\'for\'这样的常用词具有较高的归因值,我们想要重新评估我们的训练数据和模型。此类分析还可以帮助我们识别偏差。以下是Keras问题的一个例子:
同样,我们的模型选择了Keras独有的单词来进行预测,比如\'lstm\'和\'dense\'。
将模型部署到Cloud AI Platform
我们可以使用新的自定义代码功能将我们的模型部署到AI平台。这将让我们编写在预测时运行的自定义服务器端Python代码。由于我们需要将文本转换为一个单词矩阵包,然后将其传递给我们的模型进行预测,因此该功能特别有用。通过将原始文本直接传递给我们的模型并让服务器处理转换,我们将能够使客户端变得非常简单。我们可以通过编写一个Python类来实现这一点,我们对模型返回的值进行任何特征预处理或后处理。首先,我们将上面的Keras代码转换为TextPreprocessor类(改编自这篇文章)。 create_tokenizer方法使用提供的词汇表大小实例化一个tokenizer对象,并将transform_textconverts文本转换为一个单词矩阵包。
from tensorflow.keras.preprocessing import textclass TextPreprocessor(object): def __init__(self, vocab_size): self._vocab_size = vocab_size self._tokenizer = None def create_tokenizer(self, text_list): tokenizer = text.Tokenizer(num_words=self._vocab_size) tokenizer.fit_on_texts(text_list) self._tokenizer = tokenizer def transform_text(self, text_list): text_matrix = self._tokenizer.texts_to_matrix(text_list) return text_matrix
然后,我们的自定义预测类利用它来预处理文本并将预测作为sigmoid概率列表返回:
import pickleimport osimport numpy as npclass CustomModelPrediction(object): def __init__(self, model, processor): self._model = model self._processor = processor def predict(self, instances, **kwargs): preprocessed_data = self._processor.transform_text(instances) predictions = self._model.predict(preprocessed_data) return predictions.tolist() @classmethod def from_path(cls, model_dir): import tensorflow.keras as keras model = keras.models.load_model( os.path.join(model_dir,\'keras_saved_model.h5\')) with open(os.path.join(model_dir, \'processor_state.pkl\'), \'rb\') as f: processor = pickle.load(f) return cls(model, processor)
要在AI平台上部署模型,您需要拥有一个Google Cloud Project以及一个云存储桶 - 您可以在此处放置已保存的模型文件和其他资产。首先,您需要使用gcloud CLI在AI Platform中创建模型(如果您从Python笔记本中运行此命令,请在gcloud命令前添加!)。我们将使用以下内容创建模型:
gcloud ai-platform models create your_model_name
然后,您可以使用gcloud beta ai-platform版本创建部署模型。 --prediction-classflag将我们的模型指向它应该在预测时运行的Python代码:
gcloud beta ai-platform versions create v1 --model your_model_name \\--origin=gs://your_model_bucket/ \\--python-version=3.5 \\--runtime-version=1.13 \\--framework=\'TENSORFLOW\' \\--package-uris=gs://your_model_bucket/packages/so_predict-0.1.tar.gz \\--prediction-class=prediction_class_file.CustomModelPredictionName
如果您导航到云控制台的AI 平台模型部分,您应该会在几分钟内看到您的模型已部署:
我们已经部署了模型以及一些用于预处理文本的自定义代码。请注意,我们还可以使用自定义代码功能进行后期处理。如果我这样做,我可以将上面讨论的所有SHAP逻辑放入一个新方法中,以便将SHAP属性返回给客户端并将它们显示给最终用户。
编译出品
怎么申请pos机,要有什么条件?
安装POS机要开对公帐户,但是开对公帐户对于个体工商户来说是比较麻烦的,坦白的讲那是不划算,因为开对公帐户所需要的条件是:
1、营业执照副本的复印件,盖公章.
2、税务登记证副本的复印件,盖吵樱碰公章.
3、组织机构代码证副本的复印件,盖公章.
4、银行开户许可证,盖公章.
5、法人身份证的复印件,盖公章.
光办证所产生的费用就要几百,试想一下这划算吗???
什么是最简单的方法:以上是开对公帐户,现在银行这块已经开展了对私帐户的业务,其方法就是将POS机上面消费的金额直接汇到你的银行卡上面,不仅节省了你宝贵的时间,又增加了效益,
1、提升企业形象:具备受理银行卡的商户意味着收单行,银行卡组织的资信认可,体现商户的档次
2、扩大销售额:银行可以提高持卡人一定的免息期和透支额度,刷卡消费已经形成时尚,可以刺激消费,扩大升谈销售额.
3、及时入帐:由银行提供结算服务,销售款一般情况下1--3个工作日可以入帐,降低商会财务的工作强颂好度,提高财务的工作效率.
4、降低成本与风险:避免大量现金的收付,运送和保管,避免收银员收取假币.无需准备大量零钱和找付.减低了现金收付和保管的成本与风险.
5、便于销售管理:POS机具可以打印当日交易流水和明细,便于掌握商户当日和以往的交易明细.
pos机业务怎么跑?
pos业务很好跑,开始,只要勤奋,肯吃苦,,我的一个朋友,一开始很辛苦,每天都坚持跑到晚上八九点钟,进屋发玩单页就走了,感觉很累没什么进展,每天一总结,有什么跑的不对的地方就改进,跑了三天就开单了,后来客户越跑越多,在后来开发新客户维护老客户,没事在公司发qq小广告,只要你用心,会越来越轻松的,天道酬勤!
以上就是关于怎么开发pos机,我想构建一个能够与开发人员产生共鸣的机器学习模型的知识,后面我们会继续为大家整理关于怎么开发pos机的知识,希望能够帮助到大家!
