python积累日志(1).oneR的python实现

python捡漏

跟着老师上课,在看数据挖掘这一块,自己买了本和python有关的数据挖掘的书跟着看。因为python的基础还不是很好,所以就用一些实例的代码顺便积累一下。

from sklearn.datasets import load_iris
dataset=load_iris()
print(dataset.DESCR) #查看数据集

在数据集中,通常一横行表示一个样本,以列表示一个特征。 数据集的特征为连续值,但在算法中用的是类别值。当只有0,1两个属性的时候,可以通过设定一个阈值来将连续值转化成类别值。比如当x>m时,将类别值记为1,反之则记为0。
在书中,作者通过每一个特征值与均值的大小对比,来确定类别值。

dmeans=x.mean(axis=0) #其中x表示数据集。axis=0表示数据按列求和然后取平均
x_d=np.array(x>=dmeans,dtype='int') #当x>dmeans时,记为1

oneR算法

后面书里讲了oner算法,一个很简单的入门,想了一下,还是写上吧:
oneR即为ONE RULE,一个规则,死磕到底。

  • 遍历特征的取值,对于**每一个特征值**,统计它在各个类别中出现的次数
  • 找到它出现次数最多的类别,并计算出它的错误率
  • 对**每个特征**都做上述的操作,然后找出错误率最低的特征作为分类准则。

最开始年幼无知,对于0,1两个特征值,任性的觉得只用统计1,忽略了0。但是做到后面才知道这个算法简单粗暴的直接用一个特征的0,1来判断,所以当你要判断的有三个类别时,它是很明显的不够用的。比如对于A\B\C三个要区分的东西,而且他们都具有a\b\c三个特征,最后这个算法是选取其中的一个特征,假设我们选取了a,当a只有两个类别值的时候,a=0时就武断的定位B,a=1时就武断的定位C。是的,就这样简单粗暴,不管A了。

毕竟也只是入门级啊,不计较了。


python捡漏

在代码中用了一个defaultdict,因为一直对字典似懂非懂觉得比较懵,所以感觉挺难,后来也就发现,只是可以不提前指定一个值,这个值可以随着程序的运行,让他的值发生改变。

class_counts=defaultdict(int) #是不是可以理解为声明了一个这种样子的字典
for sample,y in zip(x,kind):
    if sample[feature]==Tvalue:
        class_counts[kind]+=1

以上是对某一个特征feature的特征值为value时的每种kind出现次数的统计。所以很明显的可以看出,对于class_counts这个字典来说,kind是它的key,它的value随着程序的进行发生改变,但是个int值。

sorted_class_counts=sorted(class_counts.items(),key=itemgetter(1),reverse=True)

上面是对class_counts的统计结果进行排序。其中:
class_counts.items()示意列表的形式对字典中的key,value进行返回,从而,我们可以在这个排序函数中通过itemgetter()来指定要排序的值
itemgetter(1)就表示了选取的是字典中的之前一直在执行加一操作的value。
reverse则表示是从小到大还是从大到小。因为要统计出现最频繁的,所以选择了倒序,令其为true.

在后面,我们将最频繁的那个值取出来,就将它记为该特征值的如果当前特征值Tvalue的话对应的类别判定,计算它的错误率。
随后对另一特征值做相同的操作,然后再对每一个特征再继续这样…….没什么好说的了。


我们最后的model被记作一个字典。我们需要用测试集的数据来检查这个model,即用这个model对未知的数据集进行分类。

model={'feature':best_feature,'predictor':{0:A,1:B}}
def predict(x_test,model):
    feature=model['feature']
    predictor=model['predictor']
    predicted=np.array([predictor[sample[feature]] for sample in x_test])
    return predicted

好了,只是觉得这个的思路对于我这种之前么有接触过python的人觉得还蛮有意思的,所以就在这里remark一下。
可能看到的人可能不太理解我这种奇怪的思路,但是呐,现在真的还不到发博客装逼的时候,默默匿了,一把辛酸泪。

你可能感兴趣的:(python入门渣渣)