300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 利用Python实现常用的分类算法

利用Python实现常用的分类算法

时间:2022-03-20 17:37:58

相关推荐

利用Python实现常用的分类算法

01

数据分类

正所谓物以类聚人与群分,生活里很多东西都存在着分类,当你进入超市的时候有着“日常生活用品”,“零食区”,“衣服类”等等的分类,一个分类里有不同的商品。

02

分类方法

那么问题来了,怎么分类呢?按照什么分类呢?我们仍然用超市的分类来说明,在超市的分类中,我们可以看到在同一个类中的商品用途是差不多的。也有的分类是按照商品的性质来分的。如果是按照商品的用途这一单一的规则来分类的话,我们通常叫这种分类方式为OneR算法(One Rule一个规律算法),这也是今天我们要说的分类方法。

03

OneR算法

那么什么是OneR算法呢?简单的来说是,根据现有的数据集,具有相同的特征值的个体最可能属于哪个类别,然后进行分类。当然这边的分类依据只是根据一种规则来进行分类的。在数据分类部分还有一些分类算法,这些算法跟OneR算法比较起来复杂了许多,而且也更加的准确。既然这样的话,也许你会问,既然还有更好用的算法为什么要用这个比较”low“的算法呢?这样说起来也对,但是这个OneR算法在很多真实数据上的应用算是很常见的了!

上面的热身结束,重头戏来了!!!

04

代码实现

1、准备数据集

要进行数据分类怎么能缺少数据集呢?这边我们将使用著名的Iris植物分类数据集,这个数据集里有150条植物信息。下面我们来导入这个数据集,根据下面的代码以及图片的展示我们可以发现这个植物分类数据集有4个特征值,分别为:sepal length、sepal width、petal length、petal width(分别表示的萼片和花瓣的长宽)

fromsklearn.datasetsimportload_irisimportnumpyasnpdataset=load_iris()x=dataset.datay=dataset.targetprint(dataset.DESCR)

数据准备:importnumpyasnp#data为特征值data=dataset.data#target为分类类别target=dataset.targetaverage_num=data.mean(axis=0)data=np.array(data>average_num,dtype="int")#print(dataset)#可以自己尝试打印看看数据内容fromsklearn.model_selectionimporttrain_test_split#随机获得训练和测试集defget_train_and_predict_set():#对应的参数意义data(待划分样本数据)target(样本数据的结果)random_state(设置随机种子,默认值为0如果为0则的话每次随机结果都不一样,反之是一样的)returntrain_test_split(data,target,random_state=14)data_train,data_predict,target_train,target_predict=get_train_and_predict_set()2、实现算法我们之前就说到,我们是根据一个规则来实现分类的。首先我们先遍历每个特征的取值,对每个特征的取值,统计它在不同的类别出现的次数,然后找到最大值,并记录它在其他类别中出现的次数(为了统计错误率)。fromcollectionsimportdefaultdictfromoperatorimportitemgetter#定义函数训练特征deftrain_feature(data_train,target_train,index,value):"""data_train:训练集特征target_train:训练集类别index:特征值的索引value :特征值"""count=defaultdict(int)forsample,class_nameinzip(data_train,target_train):if(sample[index]==value):count[class_name]+=1#进行排序sort_class=sorted(count.items(),key=itemgetter(1),reverse=True)#拥有该特征最多的类别max_class=sort_class[0][0]max_num=sort_class[0][1]all_num=0forclass_name,class_numinsort_class:all_num+=class_num#print("{}特征,值为{},错误数量为{}".format(index,value,all_num-max_num))#错误率error=1-(max_num/all_num)#最后返回使用给定特征值得到的待预测个体的类别和错误率returnmax_class,error对于某个特征,遍历其每一个特征值,每次调用train_feature这个函数的时候,我们就可以得到预测的结果以及这个特征的最大错误率,也可以得到最好的特征以及类型,下面我们进行函数的编写:deftrain():errors=defaultdict(int)class_names=defaultdict(list)#遍历特征foriinrange(data_train.shape[1]):#遍历特征值forjinrange(0,2):class_name,error=train_feature(data_train,target_train,i,j)errors[i]+=errorclass_names[i].append(class_name)returnerrors,class_nameserrors,class_names=train()#进行排序sort_errors=sorted(errors.items(),key=itemgetter(1))best_error=sort_errors[0]best_feature=best_error[0]best_class=class_names[best_feature]print("最好的特征是{}".format(best_error[0]))print(best_class)3、测试算法#进行预测defpredict(data_test,feature,best_class):returnnp.array([best_class[int(data[feature])]fordataindata_test])result_predict=predict(data_predict,best_feature,best_class)print("预测准确度{}".format(np.mean(result_predict==target_predict)*100))print("预测结果{}".format(result_predict))我们可以发现预测的准确度为65.79%,这个准确度对于OneR算法来说已经很高啦!到此OneR算法完成啦!再次强调欢迎大家的指导批评,谢谢!参考文献:/xiaohuiduan/data_mining●图解最常用的10大机器学习算法!●12000+字超详细 SQL 语法速成!后台回复“入群”即可加入小z干货交流群

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。