2、创建分类器笔记

创建分类器

简介:分类是指利用数据的特性将其分类成若干类型的过程。分类与回归不同,回归的输出是实数。监督学习分类器就是用带标记的训练数
据建立一个模型,然后对未知的数据进行分类。
分类器可以实现分类功能的任意算法,最简单的分类器就是简单的数学函数。其中有二元(binary)分类器,将数据分成两类,也可多元(multiclass)分类器,将数据分成两个以上的类型。解决分类问题的数据手段都倾向于解决二元分类问题,可通过不同形式对其进行扩展,进而解决多元分类。

1、建立简单分类器

import numpy as np
import matplotlib.pyplot as plt# 准备数据
X = np.array([[3,1], [2,5], [1,8], [6,4], [5,2], [3,5], [4,7], [4,-1]])
y = [0, 1, 1, 0, 0, 1, 1, 0]
# 根据y的值分类X,取值范围为0~N-1,N表示有N个类
class_0=np.array([X[i] for i in range(len(X)) if y[i]==0])
class_1=np.array([X[i] for i in range(len(X)) if y[i]==1])
# 将点画出
plt.figure()
plt.scatter(class_0[:,0],class_0[:,1],color='red',marker='s')
plt.scatter(class_1[:,0],class_1[:,1],color='black',marker='x')
# 创建y=x的直线
line_x=range(10)
line_y=line_x
plt.plot(line_x,line_y,color='blue',linewidth=3)
plt.show()

2、逻辑回归分类器

逻辑回归是一种分类方法,给定一组数据点,需要建立一个可以在类之间绘制线性边界的模型。就可以对训练数据派生的一组方程进行求解来提取边界。

import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt# 准备数据
X = np.array([[4, 7], [3.5, 8], [3.1, 6.2], [0.5, 1], [1, 2], [1.2, 1.9], [6, 2], [5.7, 1.5], [5.4, 2.2]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])# 初始化一个逻辑分类回归器
classifier=linear_model.LogisticRegression(solver='liblinear',C=10000)#solver设置求解系统方程的算法类型,C表示正则化强度,越小表强度越高,C越大,各个类型的边界更优。#训练分类器
classifier.fit(X,y)# 定义画图函数
def plot_classifier(classifier,X,y):# 获取x,y的最大最小值,并设置余值x_min,x_max=min(X[:,0])-1.0,max(X[:,0]+1.0)y_min,y_max=min(X[:,1])-1.0,max(X[:,1]+1.0)# 设置网格步长step_size=0.01# 设置网格x_values,y_values=np.meshgrid(np.arange(x_min,x_max,step_size),np.arange(y_min,y_max,step_size))# 计算出分类器的分类结果mesh_output=classifier.predict(np.c_[x_values.ravel(),y_values.ravel()])mesh_output=mesh_output.reshape(x_values.shape)# 画图plt.figure()#选择配色方案plt.pcolormesh(x_values,y_values,mesh_output,cmap=plt.cm.gray)# 画点plt.scatter(X[:,0],X[:,1],c=y,s=80,edgecolors='black',linewidths=1,cmap=plt.cm.Paired)# 设置图片取值范围plt.xlim(x_values.min(),x_values.max())plt.ylim(y_values.min(),y_values.max())# 设置x与y轴plt.xticks((np.arange(int(min(X[:, 0]) - 1), int(max(X[:, 0]) + 1), 1.0)))plt.yticks((np.arange(int(min(X[:, 1]) - 1), int(max(X[:, 1]) + 1), 1.0)))plt.show()# 画出数据点和边界
plot_classifier(classifier,X,y)

3、朴素贝叶斯分类去

用贝叶斯定理进行建模的监督学习分类器。
下面举个例子,虽然这个例子没有区分训练集和测试集,一般情况最好还是区分一下。

from sklearn.naive_bayes import GaussianNB# 准备数据
input_file = 'data_multivar.txt'
X = []
y = []
with open(input_file, 'r') as f:for line in f.readlines():data = [float(x) for x in line.split(',')]X.append(data[:-1])y.append(data[-1])X = np.array(X)
y = np.array(y)
# 建立朴素贝叶斯分类器
classifier_gaussiannb=GaussianNB()
classifier_gaussiannb.fit(X,y)
y_pre=classifier_gaussiannb.predict(X)
# 计算分类器的准确性
accuracy=100.0*(y==y_pre).sum()/X.shape[0]
print('结果:',accuracy)
# 画出数据和边界
plot_classifier(classifier_gaussiannb,X,y)

4、将数据集分割成训练集和数据集

分割训练集和测试集,更好的评估模型

from sklearn.naive_bayes import GaussianNB
from sklearn import cross_validation# 准备数据
input_file = 'data_multivar.txt'
X = []
y = []
with open(input_file, 'r') as f:for line in f.readlines():data = [float(x) for x in line.split(',')]X.append(data[:-1])y.append(data[-1])X = np.array(X)
y = np.array(y)
x_train,x_test,y_train,y_test=cross_validation.train_test_split(X,y,test_size=0.25,random_state=5)# 测试数据占25%,
# 建立朴素贝叶斯分类器
classifier_gaussiannb=GaussianNB()
classifier_gaussiannb.fit(x_train,y_train)
y_test_pre=classifier_gaussiannb.predict(x_test)
# 计算分类器的准确性
accuracy=100.0*(y_test==y_test_pre).sum()/x_test.shape[0]
print('结果:',accuracy)
# 画出数据和边界
plot_classifier(classifier_gaussiannb,x_test,y_test_pre)

5、用交叉验证检验模型准确性

为了能让模型更加稳定,还需要用数据的不同子集进行反复验证,若只是对特定的子集进行微调,会造成过度拟合。

5.1 性能指标

概念:

  • 精度(precision):被正确分类的样本数量占分类器分类出的总分类样本数量的百分比。
  • 召回率(recall):被正确分类的样本数量占某分类总样本数量的百分比。

    良好的机器学习模型需要保持两个指标能够同事处于合理高度,所以引入F1得分指标,是精度和召回率的合成指标,实际上是精度和召回率的调和均值(harmonic mean),公式如下:
    F1得分=2精度召回率/(精度+召回率)
    代码实现交叉验证:
    scoring参数对应的结果

      num_validations = 5# 正确率accuracy = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='accuracy', cv=num_validations)print("Accuracy: " + str(round(100*accuracy.mean(), 2)) + "%")# F1f1 = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='f1_weighted', cv=num_validations)print("F1: " + str(round(100*f1.mean(), 2)) + "%")# 精度precision = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='precision_weighted', cv=num_validations)print("Precision: " + str(round(100*precision.mean(), 2)) + "%")# 召回率recall = cross_validation.cross_val_score(classifier_gaussiannb,X, y, scoring='recall_weighted', cv=num_validations)print("Recall: " + str(round(100*recall.mean(), 2)) + "%")# 画出数据和边界plot_classifier(classifier_gaussiannb,x_test,y_test_pre)

6、混淆矩阵可视化

混淆矩阵(confusion matrix)是理解分类模型性能的数据表,它有助于我们理解如何把测试数据分成不同的类。当向对算法进行调优时,就需要在
对算法做出改变之前了解数据的错误分类情况。有些分类效果比其他分类效果差,混淆矩阵可以帮我们理解。

from sklearn.metrics import confusion_matrix# 显示混淆矩阵
def plot_confusion_matrix(confusion_mat):plt.imshow(confusion_mat,interpolation='nearest',cmap=plt.cm.gray)plt.colorbar()tick_marks=np.arange(4)plt.xticks(tick_marks,tick_marks)plt.yticks(tick_marks,tick_marks)plt.show()y_true = [1, 0, 0, 2, 1, 0, 3, 3, 3]
y_pred = [1, 1, 0, 2, 1, 0, 1, 3, 3]
confusion_mat=confusion_matrix(y_true,y_pred)
plot_confusion_matrix(confusion_mat)

7、提取性能报告

可直接使用上面的scikit-learn打印精度、召回率和F1得分。但是如果不需要单独计算各个指标,可用该函数直接从模型中提取所有统计值。

# 提取性能报告
from sklearn.metrics import classification_reporttarget_names = ['Class-0', 'Class-1', 'Class-2', 'Class-3']
print(classification_report(y_true,y_pred,target_names=target_names))

8、根据汽车特征评估质量

使用随机森林分类器,用一个包含汽车多种细节的数据集,分类吧汽车的质量分成4中:不达标、达标、良好、优秀。代码如下:

from sklearn import preprocessing
from sklearn.ensemble import RandomForestClassifier# 准备数据
input_file = 'car.data.txt'X = []
count = 0
with open(input_file, 'r') as f:for line in f.readlines():data = line[:-1].split(',')  # line[:-1]表示line中最后一个换行删除X.append(data)X = np.array(X)# 使用标记编将字符串转化为数值
label_encoder = []
X_encoder = np.empty(X.shape)
print(X[0])
for i, item in enumerate(X[0]):  # 由于相同的信息是以列的形式显示,所以应该按列进行标记编码label_encoder.append(preprocessing.LabelEncoder())  # 初始化每列的标记编码器X_encoder[:, i] = label_encoder[-1].fit_transform(X[:, i])  # 未标记编码X = X_encoder[:, :-1].astype(int)  # 将所有数据的除最后一列作为X,最后一列作为y
y = X_encoder[:, -1].astype(int)# 训练随机森林分类器
params = {'n_estimators': 200, 'max_depth': 8, 'random_state': 7}  # 跟上章监督学习中的随机森林回归的参数一个意思:
# n_estimators指评估器的数量,则决策树数量,min_samples_split指决策树分裂一个节点需要用到的最小数据样本量
classifier = RandomForestClassifier(**params)
classifier.fit(X, y)# 进行交叉验证
from sklearn import model_selection# model_selection 将之前的sklearn.cross_validation, sklearn.grid_search 和 sklearn.learning_curve模块组合到一起accuracy = model_selection.cross_val_score(classifier, X, y, scoring='accuracy', cv=3)
print('accuracy:', str(round(accuracy.mean(), 2)) + '%')# 对某条信息进行分类
input_data = ['low', 'low', '4', 'more', 'big', 'med']
input_data_encoded = [-1] * len(input_data)for i, item in enumerate(input_data):labels=[]labels.append(input_data[i])# 转换形式,否则下行会报错input_data_encoded[i] = int(label_encoder[i].transform(labels))input_data_encoder = np.array(input_data_encoded)
output_class = classifier.predict(input_data_encoder)  # 预测
print('结果:', label_encoder[-1].inverse_transform(output_class)[0])  # 最后一个编码器是结果

9、生成验证曲线

在第8节中使用了n_estimators和max_depth参数,而这两个被称为超参数(hyperparameters),分类器的性能取决于这两个参数的值,而这节就是使用验证曲线理解训练得分情况。(其他参数可不变),实例如下:

from sklearn.model_selection import  validation_curveclassifier=RandomForestClassifier(max_depth=4,random_state=7)
parameter_grid=np.linspace(25,200,8).astype(int)
train_scores,validation_scores=validation_curve(classifier,X,y,'n_estimators',parameter_grid,cv=5)#对n_estimators参数进行验证
print('training scores:',train_scores)
print('validation scores:',validation_scores)plt.figure()
plt.plot(parameter_grid,100*np.average(train_scores,axis=1),color='black')
plt.show()classifier=RandomForestClassifier(n_estimators=20,random_state=7)
parameter_grid=np.linspace(2,10,5).astype(int)
train_scores,validation_scores=validation_curve(classifier,X,y,'max_depth',parameter_grid,cv=5)#max_depth
print('training scores:',train_scores)
print('validation scores:',validation_scores)plt.figure()
plt.plot(parameter_grid,100*np.average(train_scores,axis=1),color='black')
plt.show()

10、生成学习曲线

学习曲线可帮助我们理解训练数据集大小对机器学习模型的影响,当遇到计算能力限制时,这点十分有用,实例如下:

from sklearn.model_selection import learning_curveclassifier=RandomForestClassifier(random_state=7)
parameter_grid=np.array([200,500,800,1100])
train_size,train_scores,validation_scores=learning_curve(classifier,X,y,train_sizes=parameter_grid,cv=5)#cv表示五折交叉验证
print('train_scores:',train_scores)
print('validation_scores:',validation_scores)plt.figure()
plt.plot(parameter_grid,100*np.average(train_scores,axis=1),color='black')
plt.show()

ps:虽然训练数据集的规模越小,仿佛精确度越高,但是它很容易造成过拟合问题。但是若选择较大的数据集,又会消耗更多资源,所以应综合考虑。

11、估算收入阶层

这里使用朴素贝叶斯分类器。这里的方法和第8节的一样,只是多了数字和字符串的混合编码,所以一些代码注释可查看上方第8节。

# 1、读取数据
input_file='adult.data.txt'
X=[]countLess=0
countMore=0
countAll=20000with open(input_file,'r') as f:for line in f.readlines():if '?' not in line:data=line[:-1].split(', ')# 2、若大部分点都属于同一个类型,则分类器会倾向于该类型,所以应该选出大于50k与小于等于50k各10000if data[-1]=='<=50K' and countLess<countAll:X.append(data)countLess=countLess+1elif data[-1]=='>50K' and countMore<countAll:X.append(data)countMore=countMore+1if countMore>=countAll and countLess>=countAll:break;X=np.array(X)
from sklearn import preprocessing
# 3、对数据进行编码
label_encoder=[]
for i,item in enumerate(X[0]):if item.isdigit():X[:,i]=X[:,i]else:label_encoder.append(preprocessing.LabelEncoder())X[:,i]=label_encoder[-1].fit_transform(X[:,i])y=X[:,-1].astype(int)
X=X[:,:-1].astype(int)
# 4、将数据分成训练和测试from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.naive_bayes import GaussianNB
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=5)
# 5、训练数据
classifier_gaussiannb=GaussianNB()
classifier_gaussiannb.fit(X_train,y_train)
y_test_pred=classifier_gaussiannb.predict(X_test)
# 6、提取性能指标
f1=cross_val_score(classifier_gaussiannb,X,y,scoring='f1_weighted',cv=5)
print('f1:',str(round(f1.mean()*100,2))+'%')
# 7、预测新的值
input_data = ['39', 'State-gov', '77516', 'Bachelors', '13', 'Never-married', 'Adm-clerical', 'Not-in-family', 'White', 'Male', '2174', '0', '40', 'United-States']
count=0
input_data_encoder=[-1]*len(input_data)
for i,item in enumerate(input_data):if item.isdigit():input_data_encoder[i]=int(input_data[i])else:labels = []labels.append(input_data[i])input_data_encoder[i]=int(label_encoder[count].transform(labels))count=count+1result=classifier_gaussiannb.predict(input_data_encoder)
result=label_encoder[-1].inverse_transform(result)
print('resutl:',result)

转载于:https://www.cnblogs.com/NSGUF/p/8274350.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复习上学期的HTML CSS(1)

自己跟着网上教程复习上学期的HTML CSS&#xff0c;因为已经忘得差不多了&#xff0c;而且现在学的js也要以HTML CSS为基础&#xff0c;坚持每天持续更新。 n B/S 网络结构 Browser/Server 浏览器/服务器&#xff0c;这是现在最流行的网络模式。如新浪网、凤凰网等。 C/S Clie…

星战前夜服务器维护时间,EVE星战前夜开测时间在什么时候 什么时候测试

EVE星战前夜什么时候开测&#xff0c;EVE星战前夜的测试时间在什么时候&#xff0c;想要知道EVE星战前夜测试时间的小伙伴一起来看看EVE星战前夜的相关资讯&#xff0c;了解一下游戏的开测时间吧。EVE星战前夜目前仍在开发阶段&#xff0c;目前没有进行大范围的测试&#xff0c…

3、预测模型笔记

预测模型 1、简介 预测建模&#xff08;Predictive modeling&#xff09;是一种用来预测系统未来行为的分析技术&#xff0c;它由一群能够识别独立输入变量与反馈目标关联关系的算法构成。根据观测值创建一个数学模型&#xff0c;然后用这个模型去预测未来发生的事情。 预测模型…

常见问题_智能切膜机常见问题

hoco.智能切膜机&#xff0c;如果使用了错误方式&#xff0c;会导致操作失误&#xff0c;整理4个常见问题&#xff0c;还有错误示范&#xff0c;请跟随视频去了解&#xff0c;你使用正确了吗?1. 膜切反这个需要留意切割膜的正反&#xff0c;有文字面就是正面&#xff0c;无文字…

bootstrap的栅格系统和响应式工具

关于bootstrap的响应式布局&#xff0c;昨天看了杨老师的视频教学https://www.bilibili.com/video/av18357039豁然开朗&#xff0c;在这里记录一下 一&#xff1a;meta标签的引用 <meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…

小熊错误_新手爸妈第一年带娃时,很容易犯的7个错误,对照看看你中了没

文 /关注小熊育儿&#xff0c;帮您轻松育儿带娃不是一件容易的事&#xff0c;对爸妈的时间和体力都是一种考验&#xff0c;不仅“熊孩子”让人头疼&#xff0c;育儿知识差&#xff0c;不懂科学育儿理念的“熊爸妈”也是让人很无奈的&#xff0c;最终受伤的还是孩子&#xff0c;…

python--装饰器、生成器、迭代器、元类

一、装饰器 def w1(func):def inner():func()return innerw1 def f1():print(1111111) 1.只要python解释器执行到装饰器&#xff0c;就会自动进行装饰&#xff0c;而不是等到调用的时候才进行装饰。 2.有参数的函数&#xff0c;装饰器定义方法 def w1(func):def inner(*args, *…

scss的使用方式(环境搭建)

我用的是Koala。 IDE是intellij_idea&#xff08;其他IDE也可&#xff09; 下载Koala&#xff1a;http://koala-app.com/ 2.安装&#xff08;选好位置&#xff0c;下一步即可&#xff09; 3.打开Koala&#xff0c;创建项目 》创建css文件夹》创建XXX.scss文件&#xff0c;拖到…

小程序 按需_小程序想要留住用户需哪些举措?

**当下许多企业在进行长沙小程序开发后&#xff0c;都会费劲心思在推广引流上&#xff0c;很多企业也确实起到了不错的效果&#xff0c;用户们也是纷纷来到企业的小程序中。只不过有的小程序却无法将用户留下来&#xff0c;导致用户流失&#xff0c;令推广付之东流。下面长沙小…

渍渍渍~来一发豆瓣自动登录玩玩~

今天来一个比较屌的自动化登陆工具&#xff0c;selenium模块&#xff0c;这个模块&#xff0c;比较装逼啦~具体自行百度吧&#xff01;这篇博客实现了什么功能呢~可以自动使用用户名和密码登录&#xff0c;当然&#xff0c;豆瓣对登录次数还有ip地址做了一些策略&#xff0c;例…

Redis数据库入门学习(下载与安装、常用命令、在Java中操作Redis)

简介 下载与安装 数据类型 常用命令 1.字符串操作命令 2.哈希操作命令 3.列表操作命令 push是将元素总是插入到第一个 0表示第一个&#xff0c;1表示第二个。-1表示倒数第一个&#xff0c;-2表示倒数第二个。当前命令的意思是第一个到倒数第一个&#xff0c;即就是全部元素 rpo…

.NET使用Office Open XML导出大量数据到 Excel

我相信很多人在做项目的都碰到过Excel数据导出的需求&#xff0c;我从最开始使用最原始的HTML拼接&#xff08;将需要导出的数据拼接成TABLE标签&#xff09;到后来happy的使用开源的NPOI, EPPlus等开源组件导出EXCEL&#xff0c;但不久前&#xff0c;我在一个项目碰到一个需求…

CSS自定义消息提示

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#confirm{position: absolute;z-index: 1;display: inline-block;border: 1px solid black;backgr…

file 选择的文件胖多有多大_如何删除 macOS 压缩包中的隐藏文件?

如何删除 macOS 压缩包中的隐藏文件&#xff1f;在工作中&#xff0c;压缩打包文件是不可缺少的一项工作。为了避免文件的损坏和缺失&#xff0c;我们通常在macOS系统中&#xff0c;把多个文件或文件夹压缩后进行传输&#xff0c;我们一般使用访达&#xff08;Finder&#xff0…

CSS画各种二维图形

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#triangle_top{display: inline-block;width:0;height:0;border-left:50px solid transparent;bor…

数据库的开启与关闭

今天&#xff0c;为了一些原因&#xff0c;要重启数据库&#xff0c;但因为当时安装的时候&#xff0c;同学随便装了&#xff0c;导致很多文件都找不到&#xff0c;想使用绝对路径重启数据的计划卡死在了路上。以下&#xff0c;我写下我的数据库开启、关闭的方法&#xff0c;方…

leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?

推荐观看&#xff1a;java技术进阶&#xff1a;膜拜&#xff01;字节大神总结的666页大师级算法宝典&#xff0c;分分钟团灭LeetCode​zhuanlan.zhihu.com2020最新马士兵老师联手左程云老师丨数据结构与算法丨面试BATJ必备​www.bilibili.com我是大二的时候开始接触LeetCode的&…

IntelliJ IDEA:使用Google Guava生成equals,hashCode和toString

问题 在Java领域&#xff0c;我们经常需要编写equals &#xff0c; hashCode和toString方法。 老实说&#xff0c;这通常只是一个样板义务。 得益于智能IDE&#xff0c;我们通常不再自己这样做。 我们只是让和IDE一起努力。 不过有一个问题。 生成的代码通常非常丑陋。 让我们…

Appscan_web安全测试工具 (含修改启动浏览器的方法)

安全测试应该是测试中非常重要的一部分&#xff0c;但他常常最容易被忽视掉。 尽管国内经常出现各种安全事件&#xff0c;但没有真正的引起人们的注意。不管是开发还是测试都不太关注产品的安全。当然&#xff0c;这也不能怪我们苦B的“民工兄弟”。因为公司的所给我们的时间与…

传说之下地图素材_【开阔眼界】地图上的史记——名著轻松读

购买链接&#xff1a;https://j.youzan.com/Zns-38我读了无数次《史记》&#xff0c;每次都是读了开头没几页就放弃&#xff0c;文言文看不懂&#xff0c;翻译的白话文内容又太枯燥&#xff0c;现在居然有图画版的史记&#xff0c;还附有说明&#xff0c;真是太好了&#xff0c…