Two_监督学习经典模型-分类学习

Author:龙箬
Data Science and Big Data Technology
Change the world with data!
优快云@weixin_43975035
有时候,屈辱的活着比悲壮的死去更需要勇气。

监督学习经典模型-分类学习

本实验使用到的部分数据集如下: Titanic.
提取码:kizl

线性分类器

#良恶性乳腺癌肿瘤数据预处理

import pandas as pd
import numpy as np

#创建特征列表
column_names=['Sample code number','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']
data=pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names=column_names)
data

在这里插入图片描述

#将?替换为标准缺失值表示
data=data.replace(to_replace='?',value=np.nan)
#丢弃带有缺失值的数据(只要有一个维度有缺失)
data=data.dropna(how='any')
#输出data的数据量和维度
data.shape
#使用线性分类模型从事良恶性乳腺癌肿瘤预测任务

#使用sklearn.model_selection 里的train_test_split模块用于分割数据
from sklearn.model_selection import train_test_split

#随机采样25%的数据用于测试集合,剩下的75%用于构建训练集合
X_train,X_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)
#查验训练样本的数量和类别分布
y_train.value_counts()
#查验测试样本的数量和类别分布
y_test.value_counts()
# 从 sklearn.preprocessing 中导入 StandardScaler
from sklearn.preprocessing import StandardScaler

#从 sklearn.linear_model 中导入 LogisticRegression 与 SGDClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier

#标准化数据,保证每个维度的特征数据方差为1,均值为0,以使预测结果不会被某些维度过大的特征值而主导
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)
#初始化 LogisticRegression 与 SGDClassifier
#LogisticRegerssion算法的solver仅支持以下几个参数'liblinear', 'newton-cg', 'lbfgs', 'sag', 'saga'
lr=LogisticRegression(solver='liblinear')
sgdc=SGDClassifier()

#调用 LogisticRegression 中的 fit 函数/模块用来训练模型参数
lr.fit(X_train,y_train)
#使用训练好的模型lr对X_test进行预测,结果储存在变量lr_y_predict中
lr_y_predict=lr.predict(X_test)

#调用 SGDClassifier 中的 fit 函数/模块用来训练模型参数
sgdc.fit(X_train,y_train)
#使用训练好的模型sgdc对X_test进行预测,结果储存在变量sgdc_y_predict中
sgdc_y_predict=sgdc.predict(X_test)
# 使用线性分类模型从事良恶性肿瘤预测任务的性能分析

from sklearn.metrics import classification_report

#使用逻辑斯蒂回归模型自带的评分函数score 获得模型在测试集上的准确性结果
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))

#利用classification_report 模块获得 LogisticRegression 其他三个指标的结果
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

在这里插入图片描述

#使用随机梯度下降模型自带的评分函数score 获得模型在测试集上的准确性结果
print('Accuracy of SGD Classifier:',sgdc.score(X_test,y_test))

#利用classification_report 模块获得 SGDClassifier 其他三个指标的结果
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))

在这里插入图片描述

支持向量机(分类)

# 手写体数据读取代码

#从 sklearn.datasets 里导入手写数字加载器
from sklearn.datasets import load_digits
#从通过数据加载器获得手写数字的数码图像数据并储存在digits变量中
digits=load_digits()
#检视数据规模和特征维度
digits.data.shape
# 手写体数据分割代码

#使用sklearn.model_selection 里的train_test_split模块用于分割数据
from sklearn.model_selection import train_test_split

#随机采样25%的数据用于测试集合,剩下的75%用于构建训练集合
X_train,X_test,y_train,y_test=train_test_split(digits.data,digits.target,test_size=0.25,random_state=33)
#分别检视训练和测试数据规模

y_train.shape
y_test.shape
# 使用支持向量机(分类)对手写数字图像进行识别

# 从 sklearn.preprocessing 中导入 StandardScaler
from sklearn.preprocessing import StandardScaler
# 从 sklearn.svm 中导入基于线性假设的支持向量机分类器LinearSVC
from sklearn.svm import LinearSVC

# 从仍然需要对训练和测试的特征数据进行标准化
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)

# 初始化线性假设的支持向量机分类器LinearSVC
# svm的LinearSVC的参数max_iter默认值为1000,改为更大的值,这里将其改为10000
lsvc=LinearSVC(max_iter=10000)
# 进行模型训练
lsvc.fit(X_train,y_train)
# 利用训练好的模型对测试样本的数字类别进行预测,预测结果储存在变量y_predict中
y_predict=lsvc.predict(X_test)
#支持向量机(分类)模型对手写体数码图像识别能力的评估

# 使用模型自带的评估函数进行准确性测评
print('The Accuracy of Linear SVC is',lsvc.score(X_test,y_test))

# 依然利用 sklearn.metrics 里面的 classification_report 模块对预测结果做更加详细的分析
from sklearn.metrics import classification_report
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))

在这里插入图片描述

朴素贝叶斯

# 读取20类新闻文本的数据细节

#从 sklearn.datasets 里导入新闻数据抓取器 fetch_20newsgroups
from sklearn.datasets import fetch_20newsgroups
# 与之前预存的数据不同,fetch_20newsgroups需要即时从互联网下载数据
news=fetch_20newsgroups(subset='all')

# 可能是由于外网的原因,速度极慢,故可以使用
#https://blog.youkuaiyun.com/The_Time_Runner/article/details/92800057?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
#此博客的方法进行修改fetch_20newsgroups函数

#查验数据规模和细节
print(len(news.data))
print(news.data[0])

在这里插入图片描述

# 20类新闻文本数据分割

#从sklearn.model_selection 导入train_test_split
from sklearn.model_selection import train_test_split

#随机采样25%的数据用于测试集
X_train,X_test,y_train,y_test=train_test_split(news.data,news.target,test_size=0.25,random_state=33)
# 使用朴素贝叶斯分类器对新闻文本数据进行类别预测

# 从sklearn.feature_extraction.text 中导入用于文本特征向量转化模块
from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer()
X_train=vec.fit_transform(X_train)
X_test=vec.transform(X_test)

# 从sklearn.naive_bayes 里导入朴素贝叶斯模型
from sklearn.naive_bayes import MultinomialNB

# 从使用默认设置初始化朴素贝叶斯
mnb=MultinomialNB()
# 利用训练数据对模型进行参数估计
mnb.fit(X_train,y_train)
# 对测试样本进行类别预测,结果存储在变量y_predict中
y_predict=mnb.predict(X_test)
# 对朴素贝叶斯分类器在新闻文本数据上的表现性能进行评估

# 从 sklearn.metric 里导入 classification_report 用于详细的分类性能报告
from sklearn.metrics import classification_report
print('The Accuracy of Naive Bayes Classifier is',mnb.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=news.target_names))

在这里插入图片描述

K近邻(分类)

# sklearn.datasets 导入 iris 数据加载器
from sklearn.datasets import load_iris
# 使用加载器读取数据并且存入变量 iris
iris=load_iris()

#查验数据规模
iris.data.shape
# 查看数据说明,对于一名机器学习的实践者来说,这是一个好习惯
print(iris.DESCR)

在这里插入图片描述

# 对Iris数据集进行分割

#从sklearn.model_selection 里选择导入train_test_split模块用于分割数据
from sklearn.model_selection import train_test_split

#从使用train_test_split 利用随机种子 random_state 采样50%的数据作为测试集
X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.50,random_state=33)
# 使用K近邻分类器对鸢尾花(Iris)数据进行类别预测

# 从 sklearn.preprocessing 里选择导入 数据标准化模块
from sklearn.preprocessing import StandardScaler
# 从 sklearn.neighbors 中导入KNeighborsClassifier,即K近邻分类器
from sklearn.neighbors import KNeighborsClassifier

#对训练和测试的特征数据进行标准化
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.fit_transform(X_test)

# 使用K近邻分类器对测试数据进行类别预测,预测结果储存在变量y_predict中
knc=KNeighborsClassifier()
knc.fit(X_train,y_train)
y_predict=knc.predict(X_test)
# 对K近邻分类器在鸢尾花(Iris)数据上的预测性能进行评估

#使用模型自带的评估函数进行准确率预测
print('The Accuracy of K-Nearest Neighbor Classifier is',knc.score(X_test,y_test))

# 依然利用 sklearn.metrics 里面的 classification_report 模块对预测结果做更加详细的分析
from sklearn.metrics import classification_report
print(classification_report(y_test,y_predict,target_names=iris.target_names))

在这里插入图片描述

决策树

#泰坦尼克号乘客数据查验

# 导入pandas用于数据分析
import pandas as pd
titanic=pd.read_csv('C:\\Users\\lenovo\\Desktop\\PYTHON机器学习及实践\\Titanic.csv')
titanic.head()

在这里插入图片描述

# 使用pandas, 数据都转入pandas独有的 dataframe 格式(二维数据表格),直接使用info(),查看数据的统计特性
titanic.info()

在这里插入图片描述

#使用决策树模型预测泰坦尼克号乘客的生还情况

# 机器学习有一个不太被初学者重视并且耗时,但是十分重要的一环----特征的选择,这个需要基于一些背景知识。根据我们对这场事故的了解,Sex,Age,Pclass这些特征都很可能时决定幸免与否的关键因素
X=titanic[['Pclass','Age','Sex']]
y=titanic['Survived']

# 对当前选中的特征进行探查
X.info()

在这里插入图片描述

# 借由上面的输出,我们设计如下几个数据处理的任务:
# 1)Age这个数据列,只有714个,需要补完
# 2)Sex数据列的值都类别型,需要转化成数字特征,用0/1代替

# 首先我们补充Age里的数据,使用平均数或者中位数都是对模型偏离造成最小影响的策略

X['Age'].fillna(X['Age'].mean(),inplace=True)
# 对补充的数据重新探查
X.info()

在这里插入图片描述

# 由此得知,Age特征得到了补充

# 数据分割
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)

# 使用scikit-learn.feature_extraction 中的特征转换器
from sklearn.feature_extraction import DictVectorizer
vec=DictVectorizer(sparse=False)

# 转换特征后,我们发现凡是类别型的特征都单独剥离出来,独成一列特征,数值型的则保持不变
X_train=vec.fit_transform(X_train.to_dict(orient='record'))
print(vec.feature_names_)
# 同样需要对测试数据的特征进行转换
X_test=vec.fit_transform(X_test.to_dict(orient='record'))

# 从 sklearn.tree 中导入决策树分类器
from sklearn.tree import DecisionTreeClassifier
# 使用默认配置初始化决策树分类器
dtc=DecisionTreeClassifier()
# 使用分割到的训练数据进行模型学习
dtc.fit(X_train,y_train)
# 用训练好的决策树模型对测试特征数据进行预测
y_predict=dtc.predict(X_test)
# 决策树模型对泰坦尼克号乘客是否生还的预测性能

# 从 sklearn.metrics 导入 classification_report
from sklearn.metrics import classification_report
#输出预测准确性
print('The Accuracy of Decision Tree Classifier is',dtc.score(X_test,y_test))
# 输出更加详细的分类性能
print(classification_report(y_predict,y_test,target_names=['died','survived']))

在这里插入图片描述

集成模型(分类)

# 集成模型对泰坦尼克号乘客是否生还的预测

# 导入pandas并且重命名为pd
import pandas as pd
titanic=pd.read_csv('C:\\Users\\lenovo\\Desktop\\PYTHON机器学习及实践\\Titanic.csv')

#人工选取Pclass,Age,Sex作为判别乘客是否能够生还的特征
X=titanic[['Pclass','Age','Sex']]
y=titanic['Survived']

# 对于缺失的年龄信息,我们使用全体乘客的平均年龄代替,这样可以在保证顺利训练模型的同时,尽可能不影响预测任务
X['Age'].fillna(X['Age'].mean(),inplace=True)

# 对原始数据进行分割,25%的乘客数据用于测试
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33)

# 对类别特征进行转化,成为特征向量
from sklearn.feature_extraction import DictVectorizer
vec=DictVectorizer(sparse=False)
X_train=vec.fit_transform(X_train.to_dict(orient='record'))
X_test=vec.fit_transform(X_test.to_dict(orient='record'))

# 使用单一决策树进行模型预测以及预测分析
from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(X_train,y_train)
dtc_y_pred=dtc.predict(X_test)

# 使用随机森林分类器进行集成模型的训练以及预测分析
from sklearn.ensemble import RandomForestClassifier
rfc=RandomForestClassifier(n_estimators=100)
rfc.fit(X_train,y_train)
rfc_y_pred=rfc.predict(X_test)

# 使用梯度提升决策树进行集成模型的训练以及预测分析
from sklearn.ensemble import GradientBoostingClassifier
gbc=GradientBoostingClassifier()
gbc.fit(X_train,y_train)
gbc_y_pred=gbc.predict(X_test)
# 集成模型对泰坦尼克号乘客是否生还的预测性能

# 从 sklearn.metrics 导入 classification_report
from sklearn.metrics import classification_report

# 输出单一决策树在测试集上的分类准确性,以及更加详细的精确率,召回率,F1指标
print('The Accuracy of Decision Tree Classifier is',dtc.score(X_test,y_test))
print(classification_report(dtc_y_pred,y_test,target_names=['died','survived']))

# 输出随机森林分类器在测试集上的分类准确性,以及更加详细的精确率,召回率,F1指标
print('The Accuracy of random forest Classifier is',rfc.score(X_test,y_test))
print(classification_report(rfc_y_pred,y_test,target_names=['died','survived']))

# 输出梯度提升决策树在测试集上的分类准确性,以及更加详细的精确率,召回率,F1指标
print('The Accuracy of gradient tree boosting is',gbc.score(X_test,y_test))
print(classification_report(gbc_y_pred,y_test,target_names=['died','survived']))

在这里插入图片描述
参考致谢:
范淼,李超.Python机器学习及实践——从零开始通往Kaggle竞赛之路

如有侵权,请联系侵删
需要本实验源数据及代码的小伙伴请联系QQ:2225872659

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值