小编ali*_*dry的帖子

在scikit-learn中将分类器保存到磁盘

如何将训练有素的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)

python classification machine-learning scikit-learn

178
推荐指数
5
解决办法
10万
查看次数

如何在scikit-learn中创建/自定义自己的得分手功能?

我使用支持向量回归作为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)

python scikit-learn

30
推荐指数
2
解决办法
2万
查看次数

为什么 df.to_pickle 和本机 Python pickle 之间的 pd.DataFrame pickle 大小差异如此之大?

我有一个具有以下结构的 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 差异如此之大尺寸!另外,其中一个比另一个更受青睐吗?向后兼容性怎么样?

python pickle dataframe pandas

5
推荐指数
1
解决办法
2373
查看次数

在 SQLAlchemy 中,“过滤器”与“连接和过滤器”语法有什么区别?

更具体地说,我发现很多人在 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()正常工作。

python sql postgresql sqlalchemy

3
推荐指数
1
解决办法
719
查看次数

我如何基准(比较)Python与Clojure的性能?

我正在学习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)

python clojure python-3.x

2
推荐指数
1
解决办法
710
查看次数

如何在Clojure中迭代嵌套的dict/hash-map来自定义/变换我的数据结构?

我有一些看起来像这样的东西:

{: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)

clojure

0
推荐指数
1
解决办法
437
查看次数