我使用GridSearch从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) 如果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)
然而,总而言之,这感觉非常笨重,我确信有更好的方法.
我收到这个奇怪的错误:
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) 我试图理解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)
有谁知道这些预测和决策功能之间的关系?
我想在教学时忽略所有包装中的警告,但是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)
我是否错误地使用了这个模块,或者是否正在做一些不应该做的事情?
我有一些文本类型的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'是来自第一列的普通(非缺失)值,带有分类数据.
任何帮助都会非常受欢迎
背景:我刚刚开始使用scikit-learn,并在页面底部阅读有关joblib和pickle的内容.
使用joblib替换pickle(joblib.dump和joblib.load)可能更有意思,它对大数据更有效,但只能腌制到磁盘而不是字符串
我读了关于Pickle的问答 ,Python中常见的pickle用例,并想知道这里的社区是否可以分享joblib和pickle之间的差异?应该何时使用另一个?
我想绘制一个混淆矩阵来显示分类器的性能,但它只显示标签的数量,而不是标签本身:
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)添加到混淆矩阵中?
我正在使用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 ×10
scikit-learn ×10
matplotlib ×2
imputation ×1
logging ×1
matrix ×1
numpy ×1
pandas ×1
pickle ×1
svm ×1
warnings ×1