标签: scikit-learn

Sklearn,gridsearch:如何在执行过程中打印出进度?

我使用GridSearchsklearn优化分类的参数.有很多数据,因此整个优化过程需要一段时间:超过一天.我想在执行期间观察已经尝试过的参数组合的性能.可能吗?

python logging scikit-learn

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

将分类数据传递给Sklearn决策树

关于如何将分类数据编码为Sklearn Decission树有几篇帖子,但是从Sklearn文档中我们得到了这些

决策树的一些优点是:

(......)

能够处理数字和分类数据.其他技术通常专门用于分析仅具有一种变量类型的数据集.有关更多信息,请参阅算法

但是运行以下脚本

import pandas as pd
from sklearn.tree import DecisionTreeClassifier

data = pd.DataFrame()
data['A'] = ['a','a','b','a']
data['B'] = ['b','b','a','b']
data['C'] = [0, 0, 1, 0]
data['Class'] = ['n','n','y','n']

tree = DecisionTreeClassifier()
tree.fit(data[['A','B','C']], data['Class'])
Run Code Online (Sandbox Code Playgroud)

输出以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit
    X = check_array(X, dtype=DTYPE, accept_sparse="csc")
  File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float: b …
Run Code Online (Sandbox Code Playgroud)

python decision-tree scikit-learn

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

sklearn.LabelEncoder以前从未见过的值

如果a sklearn.LabelEncoder已安装在训练集上,如果在测试集上使用时遇到新值,则可能会中断.

我能想到的唯一解决方案是将测试集中的所有新内容(即不属于任何现有类)映射到"<unknown>",然后在后面显式添加相应的类LabelEncoder:

# train and test are pandas.DataFrame's and c is whatever column
le = LabelEncoder()
le.fit(train[c])
test[c] = test[c].map(lambda s: '<unknown>' if s not in le.classes_ else s)
le.classes_ = np.append(le.classes_, '<unknown>')
train[c] = le.transform(train[c])
test[c] = le.transform(test[c])
Run Code Online (Sandbox Code Playgroud)

这有效,但有更好的解决方案吗?

更新

正如@sapo_cosmico在评论中指出的那样,似乎上面的内容不再适用,因为我认为是实现更改LabelEncoder.transform,现在似乎正在使用np.searchsorted(我不知道以前是否是这种情况).因此,不需要将<unknown>类附加到LabelEncoder已经提取的类的列表中,而是需要按排序顺序插入:

import bisect
le_classes = le.classes_.tolist()
bisect.insort_left(le_classes, '<unknown>')
le.classes_ = le_classes
Run Code Online (Sandbox Code Playgroud)

然而,总而言之,这感觉非常笨重,我确信有更好的方法.

python scikit-learn

57
推荐指数
7
解决办法
3万
查看次数

UndefinedMetricWarning:F-score定义不明确,在没有预测样本的标签中设置为0.0

我收到这个奇怪的错误:

classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)`
Run Code Online (Sandbox Code Playgroud)

但是它也会在我第一次运行时打印出f-score:

metrics.f1_score(y_test, y_pred, average='weighted')
Run Code Online (Sandbox Code Playgroud)

我第二次跑,它提供没有错误的分数.这是为什么?

>>> y_pred = test.predict(X_test)
>>> y_test
array([ 1, 10, 35,  9,  7, 29, 26,  3,  8, 23, 39, 11, 20,  2,  5, 23, 28,
       30, 32, 18,  5, 34,  4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn

57
推荐指数
3
解决办法
7万
查看次数

Scikit学习SVC decision_function并做出预测

我试图理解decision_function和predict之间的关系,它们是SVC的实例方法(http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html).到目前为止,我已经收集到决策函数返回类之间的成对分数.我的印象是预测选择最大化其成对分数的类,但我测试了它并得到了不同的结果.这是我用来尝试理解两者之间关系的代码.首先我生成了成对分数矩阵,然后我打印出了具有最大配对分数的类,该分数与clf.predict预测的类不同.

        result = clf.decision_function(vector)[0]
        counter = 0
        num_classes = len(clf.classes_)
        pairwise_scores = np.zeros((num_classes, num_classes))
        for r in xrange(num_classes):
            for j in xrange(r + 1, num_classes):
                pairwise_scores[r][j] = result[counter]
                pairwise_scores[j][r] = -result[counter]
                counter += 1

        index = np.argmax(pairwise_scores)
        class = index_star / num_classes
        print class
        print clf.predict(vector)[0]
Run Code Online (Sandbox Code Playgroud)

有谁知道这些预测和决策功能之间的关系?

python numpy svm scikit-learn

54
推荐指数
4
解决办法
6万
查看次数

消除scikit-learn的警告

我想在教学时忽略所有包装中的警告,但是scikit-learn似乎可以解决使用warnings包来控制它的问题.例如:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    from sklearn import preprocessing

/usr/local/lib/python3.5/site-packages/sklearn/utils/fixes.py:66: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead
  if 'order' in inspect.getargspec(np.copy)[0]:
/usr/local/lib/python3.5/site-packages/sklearn/utils/fixes.py:358: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead
  if 'exist_ok' in inspect.getargspec(os.makedirs).args:
Run Code Online (Sandbox Code Playgroud)

我是否错误地使用了这个模块,或者是否正在做一些不应该做的事情?

python warnings scikit-learn

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

在scikit-learn中计算分类缺失值

我有一些文本类型的pandas数据.这些文本列中包含一些NaN值.我想要做的就是通过sklearn.preprocessing.Imputer(以最常见的值取代NaN )来归咎于那些NaN .问题在于实施.假设有一个包含30列的Pandas数据帧df,其中10列具有分类性质.一旦我跑:

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
imp.fit(df) 
Run Code Online (Sandbox Code Playgroud)

Python生成一个error: 'could not convert string to float: 'run1'',其中'run1'是来自第一列的普通(非缺失)值,带有分类数据.

任何帮助都会非常受欢迎

python pandas scikit-learn imputation

52
推荐指数
4
解决办法
5万
查看次数

joblib与pickle有什么不同的用例?

背景:我刚刚开始使用scikit-learn,并在页面底部阅读有关joblib和pickle的内容.

使用joblib替换pickle(joblib.dump和joblib.load)可能更有意思,它对大数据更有效,但只能腌制到磁盘而不是字符串

我读了关于Pickle的问答 ,Python中常见的pickle用例,并想知道这里的社区是否可以分享joblib和pickle之间的差异?应该何时使用另一个?

python pickle scikit-learn

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

sklearn情节混淆矩阵与标签

我想绘制一个混淆矩阵来显示分类器的性能,但它只显示标签的数量,而不是标签本身:

from sklearn.metrics import confusion_matrix
import pylab as pl
y_test=['business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business', 'business']

pred=array(['health', 'business', 'business', 'business', 'business',
       'business', 'health', 'health', 'business', 'business', 'business',
       'business', 'business', 'business', 'business', 'business',
       'health', 'health', 'business', 'health'], 
      dtype='|S8')

cm = confusion_matrix(y_test, pred)
pl.matshow(cm)
pl.title('Confusion matrix of the classifier')
pl.colorbar()
pl.show()
Run Code Online (Sandbox Code Playgroud)

如何将标签(health,business..etc)添加到混淆矩阵中?

python matplotlib scikit-learn

51
推荐指数
8
解决办法
10万
查看次数

如何绘制混淆矩阵?

我正在使用scikit-learn将文本文档(22000)分类为100个类.我使用scikit-learn的混淆矩阵方法来计算混淆矩阵.

model1 = LogisticRegression()
model1 = model1.fit(matrix, labels)
pred = model1.predict(test_matrix)
cm=metrics.confusion_matrix(test_labels,pred)
print(cm)
plt.imshow(cm, cmap='binary')
Run Code Online (Sandbox Code Playgroud)

这就是我的混淆矩阵的样子:

[[3962  325    0 ...,    0    0    0]
 [ 250 2765    0 ...,    0    0    0]
 [   2    8   17 ...,    0    0    0]
 ..., 
 [   1    6    0 ...,    5    0    0]
 [   1    1    0 ...,    0    0    0]
 [   9    0    0 ...,    0    0    9]]
Run Code Online (Sandbox Code Playgroud)

但是,我没有收到明确或清晰的情节.有一个更好的方法吗?

python matplotlib matrix scikit-learn text-classification

51
推荐指数
3
解决办法
11万
查看次数