名义上是一个很好的问题,但我很确定这是因为有趣的东西正在发生......
作为背景,我正在处理面部表情/识别空间中的问题,因此获得100%的准确性似乎令人难以置信地难以置信(并非在大多数应用程序中都是合理的......).我猜测数据集中存在一些一致的偏差,它使得SVM过于容易地得出答案,=或=,更可能的是,我在SVM方面做错了.
我正在寻找建议,以帮助了解发生了什么 - 是我(=我对LibSVM的使用)?还是数据?
细节:
事情尝试:
暂定结论?:
数据集的某些东西已经被摧毁 - 不知何故,在数据集中,SVM正在汲取一种微妙的,实验者驱动的效果.
(首先,这不解释为什么RBF内核会产生垃圾结果.)
非常感谢任何建议:a)如何修复我对LibSVM的使用(如果这实际上是问题)或b)确定LibSVM数据中的哪些微妙的实验者偏见正在接受.
artificial-intelligence machine-learning svm computer-vision libsvm
我的一些数据看起来像:
date, name, value1, value2, value3, value4
1/1/2001,ABC,1,1,,
1/1/2001,ABC,,,2,
1/1/2001,ABC,,,,35
Run Code Online (Sandbox Code Playgroud)
我试图达到可以运行的程度
data.set_index(['date', 'name'])
Run Code Online (Sandbox Code Playgroud)
但是,随着数据的原样,当然有重复(如上所示),所以我不能这样做(我不希望索引有重复,我不能简单地drop_duplicates(),因为这会丢失数据).
我希望能够将具有相同[日期,名称]值的行强制为单个行,如果它们可以基于某些值NaN成功收敛(类似于combine_first()的行为).例如,上述内容将最终结束
date, name, value1, value2, value3, value4
1/1/2001,ABC,1,1,2,35
Run Code Online (Sandbox Code Playgroud)
如果两个值不同且一个不是NaN,那么这两行不应该收敛(这可能是我需要跟进的错误).
(为了扩展上面的例子,实际上可能有任意数量的行 - 给定任意数量的列 - 应该能够汇聚成一行.)
这感觉就像是一个应该通过熊猫解决的问题,但我无法找到一个优雅的解决方案.
跟踪下面.
相关的Python代码段:
bucket = _get_bucket(location['bucket'])
blob = bucket.blob(location['path'])
blob.upload_from_filename(source_path)
Run Code Online (Sandbox Code Playgroud)
最终触发(来自ssl库):
OverflowError:字符串长度超过2147483647个字节
我假设有一些特殊配置选项我不见了?
这可能与这个~1.5岁的显然尚未解决的问题有关:https://github.com/googledatalab/datalab/issues/784.
帮助赞赏!
完整跟踪:
[文件"/usr/src/app/gcloud/download_data.py",第109行,在*******blob.upload_from_filename(source_path)
在upload_from_filename size = total_bytes中输入文件"/usr/local/lib/python3.5/dist-packages/google/cloud/storage/blob.py",第992行
在upload_from_file客户端,file_obj,content_type,size,num_retries中输入文件"/usr/local/lib/python3.5/dist-packages/google/cloud/storage/blob.py",第946行
文件"/usr/local/lib/python3.5/dist-packages/google/cloud/storage/blob.py",第867行,在_do_upload客户端,流,content_type,size,num_retries)
文件"/usr/local/lib/python3.5/dist-packages/google/cloud/storage/blob.py",第700行,_do_multipart_upload传输,data,object_metadata,content_type)
文件"/usr/local/lib/python3.5/dist-packages/google/resumable_media/requests/upload.py",第97行,发送时retry_strategy = self._retry_strategy)
在http_request func,RequestsMixin._get_status_code,retry_strategy中输入文件"/usr/local/lib/python3.5/dist-packages/google/resumable_media/requests/_helpers.py",第101行
在wait_and_retry response = func()中输入文件"/usr/local/lib/python3.5/dist-packages/google/resumable_media/_helpers.py",第146行
文件"/usr/local/lib/python3.5/dist-packages/google/auth/transport/requests.py",第186行,请求方法,url,data = data,headers = request_headers,**kwargs)
文件"/usr/local/lib/python3.5/dist-packages/requests/sessions.py",第508行,请求resp = self.send(prep,**send_kwargs)
文件"/usr/local/lib/python3.5/dist-packages/requests/sessions.py",第618行,发送r = adapter.send(请求,**kwargs)
文件"/usr/local/lib/python3.5/dist-packages/requests/adapters.py",第440行,发送超时=超时
文件"/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py",第601行,在urlopen chunked = chunked中)
文件"/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py",第357行,在_make_request conn.request(method,url,**httplib_request_kw)中
文件"/usr/lib/python3.5/http/client.py",第1106行,请求self._send_request(方法,url,正文,标题)
文件"/usr/lib/python3.5/http/client.py",第1151行,在_send_request self.endheaders(body)中
文件"/usr/lib/python3.5/http/client.py",第1102行,在endheaders中self._send_output(message_body)
在_send_output self.send(message_body)中输入文件"/usr/lib/python3.5/http/client.py",第936行
在send self.sock.sendall(data)中输入文件"/usr/lib/python3.5/http/client.py",第908行
在sendall v = self.send(data [count:])中输入文件"/usr/lib/python3.5/ssl.py",第891行
文件"/usr/lib/python3.5/ssl.py",第861行,发送返回self._sslobj.write(data)
文件"/usr/lib/python3.5/ssl.py",第586行,写入返回self._sslobj.write(data)
OverflowError:字符串长度超过2147483647个字节
评估数据流,并试图找出是否/如何执行以下操作。
我很抱歉,如果上面的内容微不足道,请在我们决定使用Beam或Spark等其他东西之前,先将头绕在Dataflow上。
一般用例用于机器学习:
摄取单独处理的文档。
除了易于编写的转换,我们还要基于对数据库(主要是键值存储)的查询来丰富每个文档。
一个简单的例子是地名词典:将文本分解为ngram,然后检查这些ngram是否驻留在某个数据库中,并记录(在原始文档的转换版本中)给定短语映射到的实体标识符。
如何有效地做到这一点?
天真(尽管可能对序列化要求很棘手?):
每个文档都可以简单地单独查询数据库(类似于通过Google DataFlow Transformer查询关系数据库),但是,鉴于大多数文件都是简单的键值存储,因此似乎应该有一种更有效的方法(鉴于数据库查询延迟的实际问题)。
场景1:已改进?:
当前的稻草人将表存储在Bigquery中,将它们拉下来(https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/gcp/bigquery.py),然后将它们用作侧面输入,用作每个文档函数中的键值查找。
键值表的范围通常从很小到不大(100 MB,甚至是低GB)。 多个CoGroupByKey具有相同的apache光束(“侧面输入可以任意大-没有限制;我们已经看到使用1 + TB大小的侧面输入成功地运行了管道”)表明这是合理的,至少从POV大小而言。
1)这有意义吗?这是此方案的“正确”设计模式吗?
2)如果这是一个好的设计模式...我该如何实际实现呢?
https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/gcp/bigquery.py#L53显示将结果作为AsList馈入文档功能。
i)大概,AsDict在这里更适合上述用例?因此,我可能需要首先在Bigquery输出上运行一些转换,以将其分成键,值元组;并确保密钥是唯一的;然后将其用作侧面输入。
ii)然后我需要在函数中使用侧面输入。
我不清楚的是:
对于这两个方面,如何处理Bigquery拉动产生的输出对我来说还是很模糊的。我将如何完成(i)(假设有必要)?意思是,数据格式是什么样的(原始字节?字符串?我可以研究一个很好的例子吗?)
同样,如果AsDict是将其传递给func的正确方法,我是否可以引用通常在python中使用的dict这样的内容?例如,side_input.get('blah')吗?
场景2:进一步改善了吗?(针对特定情况):
像这样,对于每个文档,将我们所有的ngram都写为键,将值作为基础索引(文档中的docid + indices),然后在这些ngram和gazeteer中的短语之间进行某种连接...然后进行另一组转换以恢复原始文档(现在带有新注释)。
即,让Beam直接处理所有联接/查找吗?
从理论上讲,Beam比在每个文档中循环遍历所有ngram并检查ngram是否在side_input中的速度要快得多。
其他关键问题:
3)如果这是做事的好方法,是否有任何技巧可以使它在流媒体情况下正常工作?其他地方的文字表明,在批处理方案之外,侧面输入缓存的工作效果更差。目前,我们专注于批量处理,但是流式传输在提供实时预测方面将变得至关重要。
4)是否有任何与Beam有关的原因可以为上述任何原因选择Java> Python?我们已经有大量现有的Python代码移至Dataflow,因此会非常喜欢Python ...但不确定上面的Python是否存在任何隐藏问题(例如,我注意到Python不支持某些功能或I / O)。
编辑:稻草人?对于示例ngram查找场景(应大力推广到常规K:V查找)