我正在使用PyML进行 SVM 分类。但是,我注意到当我使用 LOO 评估多类分类器时,结果对象不会报告灵敏度和 PPV 值。相反,它们是 0.0:
from PyML import *
from PyML.classifiers import multi
mc = multi.OneAgainstRest(SVM())
data = VectorDataSet('iris.data', labelsColumn=-1)
result = mc.loo(data)
result.getSuccessRate()
>>> 0.95333333333333337
result.getPPV()
>>> 0.0
result.getSensitivity()
>>> 0.0
Run Code Online (Sandbox Code Playgroud)
我查看了代码,但无法弄清楚这里出了什么问题。有人有解决方法吗?
我现在正在尝试使用 Weka 在我的训练数据上构建 J48 (C4.5) 分类器模型。
首先我这样做,这似乎没问题:
java -Xmx10G -cp /weka/weka.jar weka.core.converters.TextDirectoryLoader -dir /home/test/cats > /home/test/cats.arff
这似乎也正常:
java -Xmx10G -cp /weka/weka.jar weka.filters.unsupervised.attribute.StringToWordVector -i /home/test/cats.arff -o /home/test/cats-vector.arff
这不正常:
java -Xmx10G -cp /weka/weka.jar weka.classifiers.trees.J48 -t /home/test/cats-vector.arff -d /home/test/cats.model
它给出了以下错误:
weka.core.UnsupportedAttributeTypeException: weka.classifiers.trees.j48.C45Prune ableClassifierTree: Cannot handle numeric class!
at weka.core.Capabilities.test(Capabilities.java:954)
at weka.core.Capabilities.test(Capabilities.java:1110)
at weka.core.Capabilities.test(Capabilities.java:1023)
at weka.core.Capabilities.testWithFail(Capabilities.java:1302)
at weka.classifiers.trees.j48.C45PruneableClassifierTree.buildClassifier (C45PruneableClassifierTree.java:116)
at weka.classifiers.trees.J48.buildClassifier(J48.java:236)
at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1076)
at weka.classifiers.Classifier.runClassifier(Classifier.java:312)
at weka.classifiers.trees.J48.main(J48.java:948)
Run Code Online (Sandbox Code Playgroud)
所以我然后尝试了这个:
java -Xmx10G -cp /weka/weka.jar weka.classifiers.trees.J48 -t /home/test/cats.arff -d /home/test/cats.model
这也给出了错误:
weka.core.UnsupportedAttributeTypeException: weka.classifiers.trees.j48.C45PruneableClassifierTree: Cannot handle string attributes! …Run Code Online (Sandbox Code Playgroud) 我得到了如下数据集:-
patient id-1
Run Code Online (Sandbox Code Playgroud)
Heart rate pattern-82 82 87 87 89 90 89 89 89 89
Blood pressure-110 71
Body temperature-37.2
SPO2-94
Sex-0
Age-8
Hereditary-1
Smoking-0
Alcohol Intake-0
Physical Activity-1
Diabetes-0
Blood Cholesterol-0
Obesity BMI-17.5
Status-0
Run Code Online (Sandbox Code Playgroud)
(1=坏(真),0=好(假))
对于心率模式
>>>est = AdaBoostClassifier()
>>>est.fit(X_train,y_train)
>>>predictions = est.predict(X_test)
>>>r2_score(y_test,predictions)
0.46999999999999997
Run Code Online (Sandbox Code Playgroud)
对于其余数据
>>>est = RandomForestClassifier(verbose=2)
>>>est.fit(X_train,y_train)
>>>predictions = est.predict(X_test)
>>>r2_score(y_test,predictions)
0.9
Run Code Online (Sandbox Code Playgroud)
我只有 264 个测试数据用于训练和测试。通过在 sklearn 中使用 AdaBoostClassifier()仅挖掘心率模式,我获得了 0.46999999999999997 的准确度。对于其余的数据集,我使用 RandomForestClassifier(verbose=2) 分别获得了 0.9 的准确度。
现在我需要将这两个结果组合成单个预测结果。由于心率是一个时间序列,我无法立即将这两个结果结合起来。连接这两个结果的最佳方式是什么?
我现在正在读一本关于机器学习的书。
NaiveBayesClassifier在作者身上工作非常支持交叉验证方法。
他建议将数据分成十个桶(文件),并在每次保留一个不同的桶时对其中的九个进行训练。
到目前为止,我唯一熟悉的方法是将数据按 50%/50% 的比例拆分为训练集和测试集,然后简单地一次性训练分类器。
有人可以解释使用交叉验证的可能优势吗?
我一直在调整深度学习教程来训练二元分类问题的逻辑回归模型的权重,教程使用下面的负对数似然成本函数......
self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)
def negative_log_likelihood(self, y):
return -T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y])
Run Code Online (Sandbox Code Playgroud)
然而,我的权重似乎没有正确收敛,因为我的验证错误在连续的 epoch 中增加。
我想知道我是否使用适当的成本函数来收敛适当的权重。注意到我的两个类非常不平衡并且我的预测变量已经标准化可能很有用
我在一堆我自己的图像数据上运行卷积神经网络(这个),形状(通道数,高度,宽度)=(3, 30, 30)。我有76960个训练样本,19240个测试样本,一共有39个类。最后几块代码是:
# Train the model using Stochastic grad descent + momentum
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
cnn.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
batch_size = 128
nb_epoch = 50
cnn.fit(x_train, y_train,
batch_size = batch_size,
nb_epoch = nb_epoch,
validation_data=(x_test, y_test),
shuffle=True)
Run Code Online (Sandbox Code Playgroud)
训练损失和准确率随 epoch 变化,但验证准确率仅从第 1 个到第 2 个 epoch(从 0.3387 到 0.3357)发生变化,然后一直保持在 0.3357。
我尝试过不同的批量大小(32、128 或 256)、学习率(从 1e-6 到 0.1,一路乘以 10)并尝试使用或不使用数据标准化(基本均值偏移和除以 sd )。这些都没有奏效。
我想根据我拥有的不同特征(文本和数字)进行二元分类。训练数据是熊猫数据框的形式。我的管道看起来像这样:
final_pipeline = Pipeline([('union', FeatureUnion(
transformer_list=[('body_trans', Pipeline([('selector', ItemSelector(key='body')),
('count_vect', CountVectorizer())])),
('body_trans2', Pipeline([('selector', ItemSelector(key='body2')),
('count_vect', TfidfVectorizer())])),
('length_trans', Pipeline([('selector', ItemSelector(key='length')),
('min_max_scaler', MinMaxScaler())]))],
transformer_weights={'body_trans': 1.0,'body_trans2': 1.0,'length_trans': 1.0})),
('svc', SVC())])
Run Code Online (Sandbox Code Playgroud)
ItemSelector 看起来像这样:
class ItemSelector(BaseEstimator, TransformerMixin):
def __init__(self, key):
self.key = key
def fit(self, x, y=None):
return self
def transform(self, data_frame):
return data_frame[[self.key]]
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试时final_pipeline.fit(X_train, y_train),它给了我ValueError: blocks[0,:] has incompatible row dimensions例外。
X_train, X_test, y_train, y_test = train_test_split(train_set, target_set)
Run Code Online (Sandbox Code Playgroud)
是我获取训练数据的方式。
train_set是的字段的数据帧body,body2,length等target_set与只叫领域的数据帧label这是我的实际标签进行分类。
编辑: …
python classification feature-extraction pandas scikit-learn
我知道使用精度和召回率的 f1 分数。但是,平均 f1 分数中的“平均”是什么?我们何时使用它以及如何计算“平均值”?
编辑以明确解释我的问题:我知道 f1 分数是精度和召回率的调和平均值。而在计算 f1 score 时,需要多个分类结果来计算精度和召回率。
例如,如果我们有一个由 1000 个实例组成的数据集,我们可以得到 1000 个分类结果。然后我们把它放到列联表中,这样我们就可以计算出 f1 分数。
现在这就是我对“平均”f1 分数感到困惑的一点。我们从列联表计算 f1 分数,但什么是“均值”?只有我可以计算的是 f1 分数,那么什么是“均值”以及如何计算“均值”f1 分数?
我尝试将我的sklearn代码迁移到基本二进制分类示例上的keras。我对返回与sklearn不同的keras predict()方法有疑问。
print("X_test:")
print(X_test)
y_pred = model.predict(X_test)
print("y_pred:")
print(y_pred)
Run Code Online (Sandbox Code Playgroud)
XGBClassifier(base_score=0.5,colsample_bylevel=1,colsample_bytree=1,gamma=0,learning_rate=0.1,max_delta_step=0,max_depth=3,min_child_weight=1,missing=None,n_estimators=100,nthread=-1,objective='二元:逻辑',reg_alpha=0,reg_lambda=1,scale_pos_weight=1,seed=0,silent=True,subsample=1)
--- 预测 Sklearn ---
X_test: [[ 1. 90. 62. ..., 27.2 0.58 24. ] [ 7. 181. 84. ..., 35.9 0.586 51. ] [ 13.
152. 90. ..., 26.8 0.731 43. ] ] ..., [ 4. 118. 70. ..., 44.5 0.904 26. ] [ 7. 152. 88. ..., 50. 0.337 36. ] [ 7. 168. 88. ..., …
x = df2.Tweet
y = df2.Class
from sklearn.cross_validation import train_test_split
SEED = 2000
x_train, x_validation_and_test, y_train, y_validation_and_test = train_test_split(x, y, test_size=.02, random_state=SEED)
x_validation, x_test, y_validation, y_test = train_test_split(x_validation_and_test, y_validation_and_test, test_size=.5, random_state=SEED)
print ("Train set has total {0} entries with {1:.2f}% negative, {2:.2f}% positive".format(len(x_train),(len(x_train[y_train == 0])/ (len(x_train)*1.))*100,(len(x_train[y_train == 1]) / (len(x_train)*1.))*100))
print("Validation set has total {0} entries with {1:.2f}% negative, {2:.2f}% positive".format(len(x_validation),(len(x_validation[y_validation == 0]) / (len(x_validation)*1.))*100,(len(x_validation[y_validation == 1]) / (len(x_validation)*1.))*100))
print ("Test set has total {0} entries with {1:.2f}% negative,{2:.2f}% positive".format(len(x_test),(len(x_test[y_test …Run Code Online (Sandbox Code Playgroud) classification python-3.x pandas logistic-regression sklearn-pandas
classification ×10
python ×4
scikit-learn ×3
pandas ×2
python-3.x ×2
kaggle ×1
keras ×1
naivebayes ×1
performance ×1
prediction ×1
pyml ×1
statistics ×1
svm ×1
time-series ×1
weka ×1