如何将训练有素的Naive Bayes分类器保存到磁盘并使用它来预测数据?
我从scikit-learn网站获得以下示例程序:
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print "Number of mislabeled points : %d" % (iris.target != y_pred).sum()
Run Code Online (Sandbox Code Playgroud) 我使用支持向量回归作为GridSearchCV中的估算器.但我想改变错误函数:而不是使用默认值(R平方:确定系数),我想定义我自己的自定义错误函数.
我尝试用一个make_scorer,但它没有用.
我阅读了文档并发现可以创建自定义估算器,但我不需要重新制作整个估算器 - 只有错误/评分函数.
我认为我可以通过将可调用者定义为得分者来实现,就像在文档中所说的那样.
但我不知道如何使用估算器:在我的情况下SVR.我是否必须切换到分类器(例如SVC)?我将如何使用它?
我的自定义错误功能如下:
def my_custom_loss_func(X_train_scaled, Y_train_scaled):
error, M = 0, 0
for i in range(0, len(Y_train_scaled)):
z = (Y_train_scaled[i] - M)
if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) > 0:
error_i = (abs(Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z))
if X_train_scaled[i] > M and Y_train_scaled[i] > M and (X_train_scaled[i] - Y_train_scaled[i]) < 0:
error_i = -(abs((Y_train_scaled[i] - X_train_scaled[i]))**(2*np.exp(z)))
if X_train_scaled[i] > M and Y_train_scaled[i] …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下结构的 pandas 数据框(pd.DataFrame):
In [175]: df.dtypes.value_counts()
Out[175]:
int64 876
float64 206
object 76
bool 9
dtype: int64
In [176]: df.shape
Out[176]: (9764, 1167)
Run Code Online (Sandbox Code Playgroud)
我通过以下三种方式将数据存储到磁盘:
In [170]: df.to_csv('df.csv')
In [171]: df.to_pickle('df_v1.pkl')
In [172]: import pickle
In [173]: with open('df_v2.pkl', 'wb') as handle:
.....: pickle.dump(df, handle)
Run Code Online (Sandbox Code Playgroud)
磁盘上文件的大小如下:
df.csv: 26.4 MB
df_v1.pkl: 90.5 MB
df_v2.pkl: 340.4 MB
Run Code Online (Sandbox Code Playgroud)
这csv是可以理解的小 - 它没有要保存的 pandas 开销(也就是说,它不必保存数据帧 dtypes 等)我不明白的是为什么pickle两种不同的pickle-ing 方法的 s 差异如此之大尺寸!另外,其中一个比另一个更受青睐吗?向后兼容性怎么样?
更具体地说,我发现很多人在 SQLAlchemy 中没有使用类似 SQL 的自然连接语法,而是倾向于使用过滤器来进行连接。在这里详细说明我将如何进行连接:
(session.Query(Book)
.join(Author, Publisher, Retailer)
.filter(
Author.name == "Crenshaw Adams",
Publisher.country == "United States",
Retailer.is_online == True))
Run Code Online (Sandbox Code Playgroud)
连接列隐含在模型声明文件中定义的关系中。
但在其他地方(尤其是在 StackOverflow 上),我看到人们这样做:
(session.Query(Book)
.filter(
Book.author_id == Author.id,
Author.publisher_id == Publisher.id,
Publisher.retailer_id == Retailer.id,
Author.name == "Crenshaw Adams",
Publisher.country == "United States",
Retailer.is_online == True
))
Run Code Online (Sandbox Code Playgroud)
以下哪种方法是正确的方法?哪个更 Pythonic?或者,至少,应该使用 SQLAlchemy 的方式更惯用?并且在DB资源使用或本地机器资源使用方面有区别吗(即DB的CPU和RAM压力更大,本地机器更少,反之亦然)?
此外,前一种方法不允许update()使用 Query API 上的方法 - 它抱怨不允许多表更新 - 即使我只更新一个表。后者允许update()正常工作。
我正在学习Clojure并且为了更好地处理我的进度,我决定开始用语言解决Project Euler问题(其中一些我已经用C++和Python解决了).问题1如下:
如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.
求出1000以下3或5的所有倍数的总和.
这是我第一次参加Clojure解决方案:
(defn main1
([n]
(reduce +
(filter
#(or
(= 0 (mod % 3))
(= 0 (mod % 5)))
(range n)))))
Run Code Online (Sandbox Code Playgroud)
然后我查看了我的Python版本的代码,如下所示:
import sys
import operator
from functools import reduce
def main(n=1000):
"""
returns solution up to but excluding n
"""
genexp = (num for num in range(1, n) if ((num % 3 == 0) or (num % 5 == 0)))
total = reduce(operator.add, genexp)
return total
if __name__ == "__main__":
if len(sys.argv) > 1:
print(main(int(sys.argv[1])))
else: …Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的东西:
{:person-123 {:xxx [1 5]
:zzz [2 3 4]}
:person-456 {:yyy [6 7]}}
Run Code Online (Sandbox Code Playgroud)
我想改变它,看起来像这样:
[{:person "123" :item "xxx"}
{:person "123" :item "zzz"}
{:person "456" :item "yyy"}]
Run Code Online (Sandbox Code Playgroud)
这是一个类似flatten的问题,我知道我可以通过调用name它们将关键字转换为字符串,但我无法通过方便的方式来实现这一点.
这就是我做的方式,但它似乎不优雅(嵌套for循环,我在看着你):
(require '[clojure.string :refer [split]])
(into []
(apply concat
(for [[person nested-data] input-data]
(for [[item _] nested-data]
{:person (last (split (name person) #"person-"))
:item (name item)}))))
Run Code Online (Sandbox Code Playgroud) python ×5
clojure ×2
scikit-learn ×2
dataframe ×1
pandas ×1
pickle ×1
postgresql ×1
python-3.x ×1
sql ×1
sqlalchemy ×1