我是一个绝对的初学者.从未使用Java在weka中创建分类器或任何东西我以前使用过该接口.基本上我有点失落我已经看过weka的过滤器类并且玩了一下它.我的文件是文本文件,我需要将它们分为两类.
我不确定如何定义类别或如何将文档加载到要分类的IDE中
:-(
任何帮助/教程或指针将不胜感激.
我正在写一个朴素贝叶斯分类器,用于从WiFi信号强度进行室内房间定位.到目前为止,它运行良好,但我有一些关于缺少功能的问题.这经常发生,因为我使用WiFi信号,并且WiFi接入点根本无处不在.
问题1:假设我有两个类,Apple和Banana,我想将测试实例T1分类如下.

我完全理解Naive Bayes分类器的工作原理.以下是我在Wikipedia关于分类器的文章中使用的公式.我使用统一的先验概率P(C = c),所以我在实现中省略了它.

现在,当我计算方程的右边并循环所有类条件特征概率时,我使用哪一组特征?测试实例T1使用功能1,3和4,但这两个类没有所有这些功能.因此,当我执行循环计算概率乘积时,我看到了几个关于我循环的选择:
我应该使用以上哪个?
问题2:假设我想对测试实例T2进行分类,其中T2具有在任一类中都找不到的功能.我正在使用日志概率来帮助消除下溢,但我不确定循环的细节.我正在做这样的事情(在类似Java的伪代码中):
Double bestLogProbability = -100000;
ClassLabel bestClassLabel = null;
for (ClassLabel classLabel : allClassLabels)
{
Double logProbabilitySum = 0.0;
for (Feature feature : allFeatures)
{
Double logProbability = getLogProbability(classLabel, feature);
if (logProbability != null)
{
logProbabilitySum += logProbability;
}
}
if (bestLogProbability < logProbability)
{
bestLogProbability = logProbabilitySum;
bestClassLabel = classLabel;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果没有类具有测试实例的功能(示例中的功能5),则logProbabilitySum将保持为0.0,导致bestLogProbability为0.0,或线性概率为1.0,这显然是错误的.有什么更好的方法来处理这个问题?
我有分类问题,我需要找出解决它的最佳方法.我有一套培训文件,其中一些文件中的句子和/或段落标有一些标签.并非所有句子/段落都被标记.句子或段落可能有多个标签/标签.我想做的是制作一些模型,在给出新文档的情况下,它会给出文档中每个句子/段落的建议标签.理想情况下,它只会给我高概率的建议.
如果我使用像nltk NaiveBayesClassifier这样的东西,它会给出不好的结果,我认为因为它没有考虑训练文档中的"未标记"句子,这些句子将包含许多与标记句子相似的单词和短语.这些文件具有法律/财务性质,并且充满法律/财务术语,其中大多数应在分类模型中打折扣.
除了来自训练集的标记数据之外,还有一些比Naive Bayes更好的分类算法,还是有一些方法可以将未标记的数据推入朴素的贝叶斯?
我在多类设置中看到了关于类不平衡的几个问题.但是,我有一个多标签问题,所以在这种情况下你会怎么处理?
我有一组约300k文本示例.如标题中所述,每个示例至少有一个标签,并且只有100个可能的唯一标签.我已经通过利用命名空间将这个问题简化为Vowpal Wabbit的二进制分类,例如
从:
healthy fruit | bananas oranges jack fruit
evil monkey | bipedal organism family guy
...
Run Code Online (Sandbox Code Playgroud)
至:
1 |healthy bananas oranges jack fruit
1 |fruit bananas oranges jack fruit
0 |evil bananas oranges jack fruit
0 |monkey bananas oranges jack fruit
0 |healthy bipedal organism family guy
0 |fruit bipedal organism family guy
1 |evil bipedal organism family guy
1 |monkey bipedal organism family guy
...
Run Code Online (Sandbox Code Playgroud)
我正在使用大众提供的默认选项(我认为是在线SGD,具有平方损失功能).我正在使用平方损失,因为它非常类似汉明损失.
在训练之后,当我在相同的训练集上进行测试时,我注意到所有的例子都是用'0'标签预测的 ......这是一种最小化损失的方法,我想.在这一点上,我不知道该怎么做.我正在考虑使用成本敏感的一对一分类来尝试平衡类,但是由于存在2 ^ 100个标签组合,因此将多标签减少到多类是不可行的.我想知道是否有其他人有任何建议.
编辑:我终于有机会测试类失衡,特别是vw …
classification machine-learning vowpalwabbit text-classification
例如:如果我想训练分类器(可能是SVM),我需要收集多少样本?这有一种衡量方法吗?
我有一个大小为RGB的图像uint8(576,720,3),我想将每个像素分类为一组颜色.我已经使用rgb2labRGB 转换为LAB空间,然后删除了L层,因此它现在double(576,720,2)由AB组成.
现在,我想将其归类为我在另一幅图像上训练的一些颜色,并将它们各自的AB表示计算为:
Cluster 1: -17.7903 -13.1170
Cluster 2: -30.1957 40.3520
Cluster 3: -4.4608 47.2543
Cluster 4: 46.3738 36.5225
Cluster 5: 43.3134 -17.6443
Cluster 6: -0.9003 1.4042
Cluster 7: 7.3884 11.5584
Run Code Online (Sandbox Code Playgroud)
现在,为了将每个像素分类/标记到簇1-7,我目前执行以下操作(伪代码):
clusters;
for each x
for each y
ab = im(x,y,2:3);
dist = norm(ab - clusters); // norm of dist between ab and each cluster
[~, idx] = min(dist);
end
end
Run Code Online (Sandbox Code Playgroud)
然而,由于图像分辨率和我手动遍历每个x和y,这非常慢(52秒).
是否有一些我可以使用的内置函数执行相同的工作?必须有.
总结一下:我需要一种分类方法,将像素图像分类为已定义的一组聚类.
performance matlab classification machine-learning data-mining
我正在使用sklearn中的Pipeline对文本进行分类.
在这个例子中,Pipeline我有一个TfIDF矢量化器和一些用FeatureUnion包装的自定义特征和一个分类器作为Pipeline步骤,然后我拟合训练数据并进行预测:
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
X = ['I am a sentence', 'an example']
Y = [1, 2]
X_dev = ['another sentence']
# load custom features and FeatureUnion with Vectorizer
features = []
measure_features = MeasureFeatures() # this class includes my custom features
features.append(('measure_features', measure_features))
countVecWord = TfidfVectorizer(ngram_range=(1, 3), max_features= 4000)
features.append(('ngram', countVecWord))
all_features = FeatureUnion(features)
# classifier
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001)
pipeline = Pipeline(
[('all', all_features ),
('clf', …Run Code Online (Sandbox Code Playgroud) python pipeline classification machine-learning scikit-learn
我正在使用RandomForest.featureImportances但我不理解输出结果.
我有12个功能,这是我得到的输出.
我知道这可能不是一个特定于apache-spark的问题,但我无法找到解释输出的任何地方.
// org.apache.spark.mllib.linalg.Vector = (12,[0,1,2,3,4,5,6,7,8,9,10,11],
[0.1956128039688559,0.06863606797951556,0.11302128590305296,0.091986700351889,0.03430651625283274,0.05975817050022879,0.06929766152519388,0.052654922125615934,0.06437052114945474,0.1601713590349946,0.0324327322375338,0.057751258970832206])
Run Code Online (Sandbox Code Playgroud) classification random-forest apache-spark apache-spark-mllib
我的问题简要说明:给定Python中的1d分布,如何识别具有正弦波状起伏模式的分布区域?
我正在努力识别历史文档的页面扫描中的图像.这些图像在扫描中基本上始终是全宽的(也就是说,它们基本上不与文本并置).这让我相信最简单的解决方案是删除包含文本行的页面扫描区域.
使用以下代码段,可以将图像读入内存并从上到下测量图像中每行的聚合像素亮度,将输入图像转换为下图:
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.ndimage import imread
import numpy as np
import sys
img = imread(sys.argv[1])
row_sums = list([(sum(r)/len(r)) for r in img ])
# the size of the returned array = size of row_sums input array
window_size = 150
running_average_y = np.convolve(row_sums, np.ones((window_size,))/window_size, mode='same')
# plot the y dimension pixel distribution
plt.plot(running_average_y)
plt.show()
Run Code Online (Sandbox Code Playgroud)
输入图片:
输出图:
鉴于这种分布,我现在想要确定曲线的区域,这些区域具有在图的第一个和最后三分之一中看到的规则起伏模式(粗略地说).其他人是否有关于如何处理这项任务的想法?
起初我尝试将线性模型拟合到整个1d分布,但由于种种原因而失败.我现在认为尝试将类似正弦波的东西放到曲线的某些部分可能是有意义的,但这看起来有点矫枉过正.其他人是否有关于如何最好地完成这项任务的想法?任何建议或见解将非常感谢!
classification ×10
data-mining ×2
java ×2
nlp ×2
python ×2
apache-spark ×1
bayesian ×1
documents ×1
filter ×1
matlab ×1
nltk ×1
numpy ×1
opencv ×1
performance ×1
pipeline ×1
sample-data ×1
scikit-learn ×1
vowpalwabbit ×1
weka ×1