python数据挖掘入门与实践-第一章-用最简单OneR算法对Iris植物分类

前言:

这本书其实有配套代码的来着,但是有点坑的是,里面的代码对应的版本是有点旧的,用的时候会警告或者已经报错。甚至有些代码书里提了但是却没有写进去,要自己去摸索。我是每一章都跟着代码示例,把每一个步骤都按我自己的理解注释了,然后把书里错的和缺的都自己补上了,方便我以后复习233.

还有数据集是最坑的,很多数据集都没给要我们自己去下载,然而过了这么久很多网站获取数据的方式都改了。要我们读者自己想办法……所以这本书除了数据挖掘,甚至还能锻炼爬虫技能(X)

闲来没事我就随便发第一章的最简单的了,以后有空慢慢把后面的章节都发了。


import numpy as np 
from sklearn.datasets import load_iris


dataset = load_iris()
X = dataset.data
y = dataset.target
n_samples, n_features = X.shape
#导入数据,X是每一个植物的特征值,y是每一个植物对应的类型

attribute_means=X.mean(axis=0)
X_d=np.array(X>attribute_means,dtype="int")
#连续值离散化

from collections import defaultdict
from operator import itemgetter
#defaultdict用来创建带默认值(0)的字典,itemgetter用来对字典排序

#创建针对特征值的训练器
#参数分别是(数据集,数据对应的类别,对应的特征,对应的特征值)
def train_feature_value(X,y_true,feature_index,value):
    class_counts=defaultdict(int) #记录了特征值在各个类别中出现的次数
    for sample,y in zip(X,y_true):     #以元组的形式合并了数据集和其对应的类别,然后再取出来
        if sample[feature_index]==value: #如果是相应的特征值
            class_counts[y]+=1   #就在其对应的类别中记数+1
#运行到这里已经把所有的数据都训练完,得到了原始了class_count的数据了,接下来要做的就是排序
    sorted_class_counts=sorted(class_counts.items(),key=itemgetter(1),reverse=True)
    most_frequent_class = sorted_class_counts[0][0]       #排序后取出最多次数的字典的key(就是类别)
    error = sum([class_count for class_value, class_count in class_counts.items()
                 if class_value != most_frequent_class])       #这个很长的表达式是列表生成器,就是对class_count这个字典先打散,然后如果不是对应的值,输出count并组成了列表,最后加起来
    return most_frequent_class, error

#创建针对特征的训练器(在特征中实现上面的训练器,每一个特征一个训练器)
def train_on_feature(X,y_true,feature_index):
    values=set(X[:,feature_index])     #      X[:,feature_index]是以数组形式输出指定行列的表达方式。然后set是一个无序不重复的集合,从而筛选出总共有多少个value
    predictors={}       #就用这个字典预测了!!!!
    errors=[]
    for current_value in values:         #对每一个值
        most_frequent_class,error=train_feature_value(X,y_true,feature_index,current_value)          #取出输出结果
        predictors[current_value]=most_frequent_class                         #预测结果
        errors.append(error)
    total_error=sum(errors)                                                  #计算总错误率
    return predictors,total_error

#接下来对我们的数据集进行切分,分为训练集和测试集
from sklearn.model_selection import train_test_split
Xd_train,Xd_test,y_train,y_test = train_test_split(X_d,y,random_state=None)

all_predictors ={}    #字典记录每一个特征对应的训练器
errors={}                 #字典记录每一个特征值对应的训练器的错误率
for feature_index in range(Xd_train.shape[1]):     #数据集的列数即是特征的总数
    predictors,total_error = train_on_feature(Xd_train,y_train,feature_index)           #取出数据
    all_predictors[feature_index]=predictors                                                             #字典对应
    errors[feature_index]=total_error
best_feature,best_error = sorted(errors.items(),key=itemgetter(1))[0]                  #对错误率字典排序,得到错误率最低的训练器对应的特征
model = {'feature':best_feature,'predictor':all_predictors[best_feature]}           #建立了预测模型,内含了该模型所选的特征,以及对应的预测器

#下面建立用于预测的函数,输入一个植物,给出这个植物最可能对应的类别。
def predict_a_plant(plant_d,model):
    feature=model['feature']
    predictor=['predictor']
    prediction = predictor[int(plant_d[feature])]
    return prediction
print(model)

#下面建立的预测的函数,输入对象为一个数据集,并给出对这个数据集预测的正确率
def predict(X_test,model):
    feature=model['feature']
    predictor=model['predictor']
    y_predicted =np.array([predictor[int(sample[feature])] for sample in X_test])      #又一个列表生成器,输出一个array记录下数据集所有预测的类别
    a=[predictor[int(sample[feature])] for sample in X_test]
    accuracy=np.mean(y_predicted == y_test)*100                      #array类型的数据与列表判断的时候可以直接变成bool类型的array,并且用mean方法就可以求平均值
    print("the test accuracy is {:.1f}%".format(accuracy))               #   :.1f可以保留一位小数
    return y_predicted

y_predicted = predict(Xd_test, model)
print(y_predicted) 

最后得到的正确率浮动很大,上到80下到50。毕竟是整本书最简单的算法了,用来作全书的入门233
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值