Python数据挖掘入门与实践------鸢尾花分类

 

Python数据挖掘入门与实践------鸢尾花分类

 

 

 

 

import numpy as np 
from sklearn.datasets import load_iris
 
dataset = load_iris()
#print(dataset.DESCR)  #查看数据集
X = dataset.data
y = dataset.target
#print(X)  每个植物的四个特征值
#print(y)  每一个植物对应的类型
n_samples, n_features = X.shape

attribute_means=X.mean(axis=0) #每个特征值的均值计算 [5.84333333 3.054      3.75866667 1.19866667]

X_d=np.array(X>attribute_means,dtype="int")#连续值离散化 大于均值的为1,小于均值的为0,例如[0 1 0 0]
#print(X_d)
 
from collections import defaultdict
from operator import itemgetter
#defaultdict用来创建带默认值(0)的字典,itemgetter用来对字典排序
 
#创建针对特征值的训练器
#参数分别是(数据集,数据对应的类别,对应的特征(哪一列),对应的特征值(0还是1))
def train_feature_value(X,y_true,feature_index,value):
    #print(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并组成了列表,最后加起来
    #print(most_frequent_class, error)
    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  # 例如:  ({0: 0, 1: 2}, 44)
 
#接下来对我们的数据集进行切分,分为训练集和测试集
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]):     #数据集的列数即是特征的总数[1,2,3,4]
    predictors,total_error = train_on_feature(Xd_train,y_train,feature_index)           #取出数据  ({0: 0, 1: 2}, 45)
    all_predictors[feature_index]=predictors                                                             #字典对应
    errors[feature_index]=total_error

#print(all_predictors,errors)
best_feature,best_error = sorted(errors.items(),key=itemgetter(1))[0]   #对错误率字典排序,得到错误率最低的训练器对应的特征
#print(best_feature,all_predictors[best_feature])
model = {'feature':best_feature,'predictor':all_predictors[best_feature]}  #建立了预测模型,内含了该模型所选的特征,以及对应的预测器
 
#下面建立用于预测的函数,输入一个植物,给出这个植物最可能对应的类别。
def predict_a_plant(plant_d,model):
    feature=model['feature']
    predictor=model['predictor']
    prediction = predictor[int(plant_d[feature])]
    return prediction
print(model)
 
#下面建立的预测的函数,输入对象为一个数据集,并给出对这个数据集预测的正确率
def predict(X_test,model):
    feature=model['feature']
    predictor=model['predictor']
    #print(X_test[1])
    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)
#y_predicted=predict_a_plant(Xd_test[1],model)
print(y_predicted)