头歌-机器学习 第1次实验 Python机器学习软件包Scikit-Learn的学习与运用

第1关:使用scikit-learn导入数据集

scikit-learn包括一些标准数据集,不需要从外部下载,可直接导入使用,比如与分类问题相关的Iris数据集和digits手写图像数据集,与回归问题相关的波士顿房价数据集。 以下列举一些简单的数据集,括号内表示对应的问题是分类还是回归:

 
  1. #加载并返回波士顿房价数据集(回归)
  2. load_boston([return_X_y])
  3. #加载并返回iris数据集(分类)
  4. load_iris([return_X_y])
  5. #加载并返回糖尿病数据集(回归)
  6. load_diabetes([return_X_y])
  7. #加载并返回数字数据集(分类)
  8. load_digits([n_class, return_X_y])
  9. #加载并返回linnerud数据集(多分类)
  10. load_linnerud([return_X_y])

这些标准数据集采用类字典的对象格式存储,比如.data表示原始数据,是一个(n_samples,n_features)二维数组,通过.shape可以得到二维数组大小,.target表示存储数据类别即标签。
下面我们将利用datasets加载数据集digits作为示例,如下图所示:
 

在命令行输入python进入python终端,>>>表示python终端提示符,输入python命令即可执行。y.[:5]表示标签的前5个数据。

本关任务

本关任务是使用scikit-learn的datasets模块导入iris数据集,并打印前5条原数据、前5条数据标签及原数据的数组大小。 即编程实现step1/importData.pygetIrisData()函数:

 
  1. from sklearn import datasets
  2. def getIrisData():
  3. '''
  4. 导入Iris数据集
  5. 返回值:
  6. X - 前5条训练特征数据
  7. y - 前5条训练数据类别
  8. X_shape - 训练特征数据的二维数组大小
  9. '''
  10. #初始化
  11. X = []
  12. y = []
  13. X_shape = ()
  14. #   请在此添加实现代码   #
  15. #********** Begin *********#
  16.  
  17. #********** End **********#
  18. return X,y,X_shape
测试说明

本关的测试文件是step1/testImportData.py该代码负责对你的实现代码进行测试,注意step1/testImportData.py 不能被修改,该测试代码具体如下:

 
  1. import importData
  2. X,y,X_shape = importData.getIrisData()
  3. print(X)
  4. print(y)
  5. print(X_shape)

测试函数将直接调用step1/importData.pygetIrisData()得到实际输出,平台通过比较预期输出与实际输出来判断createSVMmodel函数是否实现正确。

from sklearn import datasets
def getIrisData():'''导入Iris数据集返回值:X - 前5条训练特征数据y - 前5条训练数据类别X_shape - 训练特征数据的二维数组大小'''#初始化X = [] y = [] X_shape = () #   请在此添加实现代码   ##********** Begin *********#iris = datasets.load_iris()X = iris.data[:5]y = iris.target[:5]X_shape = iris.data.shape#********** End **********#return X,y,X_shape

第2关:数据预处理 — 标准化

本关任务

在前一关卡,我们已经学会了使用sklearn导入数据,然而原始数据总是比较杂乱、不规整的,直接加载至模型中训练会影响预测效果。本关卡,将学会使用sklearn对导入的数据进行预处理。

相关知识

原始数据存在的几个问题:不一致、重复、含噪声、维度高。数据挖掘中,数据预处理包含数据清洗、数据集成、数据变换和数据归约几种方法,在这里不过多叙述预处理方法细节,接下来将简单介绍如何通过调用sklearn中的模块进行数据预处理。

sklearn.preprocessing 模块提供很多公共的方法,将原始不规整的数据转化为更适合分类器的具有代表性的数据。一般说来,使用标准化后的数据集训练学习模型具有更好的效果。

数据标准化的方法有很多种,常用的有“最小—最大标准化”、“Z-score标准化”等等。经过上述标准化处理,各属性值都处于同一个数量级别上,可以进行综合数据分析。

Z-score 标准化 这种方法基于原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。将A的原始值x使用Z-score标准化到x'。
Z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况,其公式为:
新数据=(原数据-均值)/标准差

sklearn.preprocessing.scale函数,可以直接将给定数据进行标准化。

标准化处理后数据的均值和方差:

sklearn.preprocessing.StandardScaler类实现了Transformer接口,可以保存训练数据中的参数(均值mean_、缩放比例scale_),并能将其应用到测试数据的标准化转换中。

将标准化转换器应用到新的测试数据:

min-max 标准化
min-max标准化方法是对原始数据进行线性变换。设minA和maxA分别为属性A的最小值和最大值,将A的一个原始值x通过min-max标准化映射成在区间[0,1]中的值x',其公式为:
新数据=(原数据-极小值)/(极大值-极小值)

sklearn.preprocessing.MinMaxScaler将属性缩放到一个指定的最大和最小值(通常是1-0)之间。
MinMaxScaler中可以通过设置参数feature_range=(min, max)指定最大最小区间。其具体的计算公式为:

 
  1. X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
  2. X_scaled = X_std * (max - min) + min

将标准化缩放应用到新的测试数据:

编程要求

本关任务希望对于California housing数据集进行标准化转换。 代码中已通过fetch_california_housing函数加载好了数据集,California housing数据集包含8个特征,分别是['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude'],可通过dataset.feature_names访问数据具体的特征名称,通过在上一关卡的学习,相信大家对于原始数据的查看应该比较熟练了,在这里不过多说明。

本次任务只对California housing数据集中的两个特征进行操作,分别是第一个特征MedInc,其数据服从长尾分布;第6个特征AveOccup,数据中包含大量离群点。

本关具体分成为几个子任务: 1.使用MinMaxScaler对特征数据X进行标准化转换,并返回转换后的特征数据的前5条。 要补充的代码块如下:

 
  1. def getMinMaxScalerValue():
  2. '''
  3. 对特征数据X进行MinMaxScaler标准化转换,并返回转换后的数据前5条
  4. 返回值:
  5. X_first5 - 数据列表
  6. '''
  7. X_first5 = []
  8. #   请在此添加实现代码   #
  9. # ********** Begin *********#
  10. # ********** End **********#
  11. return X_first5

2.使用scale对目标数据y进行标准化转换,并返回转换后的前5条数据。 要补充的代码块如下:

 
  1. def getScaleValue():
  2. '''
  3. 对目标数据y进行简单scale标准化转换,并返回转换后的数据前5条
  4. 返回值:
  5. y_first5 - 数据列表
  6. '''
  7. y_first5 = []
  8. #   请在此添加实现代码   #
  9. # ********** Begin *********#
  10. # ********** End **********#
  11. return y_first5

3.使用StandardScaler对特征数据X的进行标准化转换,并返回转换后的均值和缩放比例值。 要补充的代码块如下:

 
  1. def getStandardScalerValue():
  2. '''
  3. 对特征数据X进行StandardScaler标准化转换,并返回转换后的数据均值和缩放比例
  4. 返回值:
  5. X_mean - 均值
  6. X_scale - 缩放比例值
  7. '''
  8. X_mean = None
  9. X_scale = None
  10. #   请在此添加实现代码   #
  11. #********** Begin *********#
  12. #********** End **********#
  13. return X_mean,X_scale
测试说明

本关卡的测试数据来自./step4/testDataPreprocess.py文件,平台将比对您所编写函数的返回值与正确的数值,只有所有数据全部计算正确才能进入下一关。

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import scale
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import fetch_california_housing
'''Data descrption:The data contains 20,640 observations on 9 variables.This dataset contains 
the average house value as target variableand the following input variables (features): 
average income,housing average age, average rooms, average bedrooms, population,
average occupation, latitude, and longitude in that order.
dataset : dict-like object with the following attributes:dataset.data : ndarray, shape [20640, 8]Each row corresponding to the 8 feature values in order.dataset.target : numpy array of shape (20640,)Each value corresponds to the average house value in units of 100,000.dataset.feature_names : array of length 8Array of ordered feature names used in the dataset.dataset.DESCR : stringDescription of the California housing dataset.'''
dataset = fetch_california_housing("./step4/")
X_full, y = dataset.data, dataset.target
#抽取其中两个特征数据
X = X_full[:, [0, 5]]def getMinMaxScalerValue():'''对特征数据X进行MinMaxScaler标准化转换,并返回转换后的数据前5条返回值:X_first5 - 数据列表'''X_first5 = []#   请在此添加实现代码   ## ********** Begin *********#min_max_scaler = MinMaxScaler()X_minmax = min_max_scaler.fit_transform(X)X_first5 = X_minmax[:5]# ********** End **********#return X_first5
def getScaleValue():'''对目标数据y进行简单scale标准化转换,并返回转换后的数据前5条返回值:y_first5 - 数据列表'''y_first5 = []#   请在此添加实现代码   ## ********** Begin *********#y_scaled = scale(y)y_first5 = y_scaled[:5]# ********** End **********#return y_first5
def getStandardScalerValue():'''对特征数据X进行StandardScaler标准化转换,并返回转换后的数据均值和缩放比例返回值:X_mean - 均值X_scale - 缩放比例值'''X_mean = NoneX_scale = None#   请在此添加实现代码   ##********** Begin *********#scaler = StandardScaler().fit(X)X_mean = scaler.mean_X_scale = scaler.scale_#********** End **********#return X_mean,X_scale

第3关:文本数据特征提取

本关任务

在前一关卡,我们已经学会了数据集标准化处理,标准化一般主要针对数值型数据。对于文本数据,我们无法直接将原始文本作为训练数据,需通过特征提取将其转化为特征向量。本关卡,将学习提取文本数据特征的基本操作。

相关知识

文本分析是机器学习算法的一个主要应用领域。文本分析的原始数据无法直接输入算法,因为大部分学习算法期望的输入是固定长度的数值特征向量,而不是可变长的文本数据。
为了解决这个问题,sklearn提供了一些实用工具用最常见的方式从文本内容中抽取数值特征。比如说:

  • 分词(tokenizing),对句子分词后,为每一个词(token)分配的一个整型id,通常用空格和标点符号作为分词的分割符。
  • 计数(counting),计算在某个词在文本中的出现频率。
  • 归一化权重(nomalizating and weighting), 降低在大多数样本/文档中都出现的词的权重。

在文本特征提取中,特征和样本的定义如下:

  • 将每个词出现的频率作为特征。
  • 将给定文档中所有词的出现频率所构成的向量看做一个样本。

因此,整个语料库可以看做一个矩阵,矩阵的每行代表一个文档,每列代表一个分词。我们将文档集合转化为数值特征向量的过程称为向量化。这一整套策略被称为词袋模型,用词频描述文档,完全忽略词在文档中出现的相对位置信息。

sklearn中文本数据特征提取的方法

CountVectorizer模块实现了分词和计数,该方法包含许多参数,如下图所示,打印了其默认的参数值。

常见参数:

input : 指定输入格式
tokenizer : 指定分词器
stop_words : 指定停止词,比如当设置 stop_words="english"时,将会使用内建的英语停用词列表
max_df : 设置最大词频,若为浮点数且范围在[0,1]之间,则表示频率,若为整数则表示频数
min_df : 设置最小词频
max_features: 设置最大的特征数量
vocabulary: 指定语料库,即指定词和特征索引间的映射关系表

属性:

vocabulary_ : 字典类型,返回词和特征索引间的映射关系表

 
  1. #得到词汇映射表
  2. vocab = vectorizer.vocabulary_
  3. #字典结构,返回特征值‘document’对应的下标索引
  4. vectorizer.vocabulary_.get('document')

stop_words_ : set集合,停止词集合

方法:

fit(raw_documents[, y]) : 从原文本数据得到词汇-特征索引间的映射关系
transform(raw_documents) : 将原文本集合转换为特征矩阵
fit_transform(raw_documents[, y]): 结合fit和transform方法,返回特征矩阵,如下图所示

build_analyzer() :返回预处理和分词的引用
下图表示对“This is a text document to analyze.”进行分词并验证结果

get_feature_names() :返回特征索引id对应的特征名字(下标对应的某个词)

将向量化转换器应用到新的测试数据:

注意:transform函数的返回结果是一个矩阵(sparse matrix),为了更好的表示数据,采用toarray()将数据转化为numpy数组,注意接下来的编程任务中也要转化为一个数组。

在文本语料库中,一些词非常常见(例如,英文中的“the”,“a”,“is”),但是有用信息含量不高。如果我们将词频直接输入分类器,那些频繁出现的词会掩盖那些很少出现但是更有意义的词,将达不到比较好的预期效果。为了重新计算特征的计数权重,通常都会进行TFIDF转换。
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数。IDF反文档频率(Inverse Document Frequency)是指如果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

sklearn中的TfidfVectorizer模块,实现了TFIDF思想。该模块的参数、属性及方法与CountVectorizer类似,可参考CountVectorizer的调用方式。

编程要求

本关任务,希望分别使用CountVectorizer和TfidfVectorizer对新闻文本数据进行特征提取,并验证提取是否正确。

数据介绍:

采用fetch_20newsgroups("./",subset='train', categories=categories)函数加载对应目录的新闻数据,subset='train'指定采用的是该数据的训练集,categories 指定新闻目录,具体的函数调用可参考官方文档fetch_20newsgroups。X是一个string数组,包含857个新闻文档。

本关具体分成为几个子任务:

1.使用CountVectorizer方法提取新闻数据的特征向量,返回词汇表大小和前五条特征向量

要补充的代码块如下:

 
  1. def transfer2CountVector():
  2. '''
  3. 使用CountVectorizer方法提取特征向量,返回词汇表大小和前五条特征向量
  4. 返回值:
  5. vocab_len - 标量,词汇表大小
  6. tokenizer_list - 数组,对测试字符串test_str进行分词后的结果
  7. '''
  8. vocab_len = 0
  9. test_str = "what's your favorite programming language?"
  10. tokenizer_list = []
  11. #   请在此添加实现代码   #
  12. # ********** Begin *********#
  13. # ********** End **********#
  14. return vocab_len,tokenizer_list

2.使用TfidfVectorizer方法得到新闻数据的词汇-特征向量映射关系,指定使用内建的英文停止词列表作为停止词,并且词出现的最小频数等于2。然后将向量化转换器应用到新的测试数据。

 
  1. def transfer2TfidfVector():
  2. '''
  3. 使用TfidfVectorizer方法提取特征向量,并将向量化转换器应用到新的测试数据
  4. TfidfVectorizer()方法的参数设置:
  5. min_df = 2,stop_words="english"
  6. test_data - 需要转换的原数据
  7. 返回值:
  8. transfer_test_data - 二维数组ndarray
  9. '''
  10. test_data = ['Once again, to not believe in God is different than saying....... where is your evidence for that "god is" is meaningful at some level?\n Benedikt\n']
  11. transfer_test_data = None
  12. #   请在此添加实现代码   #
  13. # ********** Begin *********#
  14. # ********** End **********#
  15. return transfer_test_data
测试说明

本关卡的测试数据来自./step5/testTextFeatureExt\fraction.py文件,平台将比对您所编写函数的返回值与正确的数值,只有所有数据全部计算正确才能进入下一关。

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizercategories = ['alt.atheism','talk.religion.misc',
]# 加载对应目录的新闻数据,包含857个文档
data = fetch_20newsgroups("./step5/",subset='train', categories=categories)
X = data.datadef transfer2CountVector():'''使用CountVectorizer方法提取特征向量,返回词汇表大小和前五条特征向量返回值:vocab_len - 标量,词汇表大小tokenizer_list - 数组,对测试字符串test_str进行分词后的结果'''vocab_len = 0test_str = "what's your favorite programming language?"tokenizer_list = []#   请在此添加实现代码   ## ********** Begin *********#vectorizer = CountVectorizer()vectorizer.fit_transform(X)vocab = vectorizer.vocabulary_vocab_len = len(vocab)analyze = vectorizer.build_analyzer()tokenizer_list = analyze(test_str)# ********** End **********#return vocab_len,tokenizer_listdef transfer2TfidfVector():'''使用TfidfVectorizer方法提取特征向量,并将向量化转换器应用到新的测试数据TfidfVectorizer()方法的参数设置:min_df = 2,stop_words="english"test_data - 需要转换的原数据返回值:transfer_test_data - 二维数组ndarray'''test_data = ['Once again, to not believe in God is different than saying\n>I BELIEVE that God does not exist. I still maintain the position, even\n>after reading the FAQs, that strong atheism requires faith.\n>\n \nNo it in the way it is usually used. In my view, you are saying here that\ndriving a car requires faith that the car drives.\n \nFor me it is a conclusion, and I have no more faith in it than I have in the\npremises and the argument used.\n \n \n>But first let me say the following.\n>We might have a language problem here - in regards to "faith" and\n>"existence". I, as a Christian, maintain that God does not exist.\n>To exist means to have being in space and time. God does not HAVE\n>being - God IS Being. Kierkegaard once said that God does not\n>exist, He is eternal. With this said, I feel it\'s rather pointless\n>to debate the so called "existence" of God - and that is not what\n>I\'m doing here. I believe that God is the source and ground of\n>being. When you say that "god does not exist", I also accept this\n>statement - but we obviously mean two different things by it. However,\n>in what follows I will use the phrase "the existence of God" in it\'s\n>\'usual sense\' - and this is the sense that I think you are using it.\n>I would like a clarification upon what you mean by "the existence of\n>God".\n>\n \nNo, that\'s a word game. The term god is used in a different way usually.\nWhen you use a different definition it is your thing, but until it is\ncommonly accepted you would have to say the way I define god is ... and\nthat does not exist, it is existence itself, so I say it does not exist.\n \nInterestingly, there are those who say that "existence exists" is one of\nthe indubitable statements possible.\n \nFurther, saying god is existence is either a waste of time, existence is\nalready used and there is no need to replace it by god, or you are implying\nmore with it, in which case your definition and your argument so far\nare incomplete, making it a fallacy.\n \n \n(Deletion)\n>One can never prove that God does or does not exist. When you say\n>that you believe God does not exist, and that this is an opinion\n>"based upon observation", I will have to ask "what observtions are\n>you refering to?" There are NO observations - pro or con - that\n>are valid here in establishing a POSITIVE belief.\n(Deletion)\n \nWhere does that follow? Aren\'t observations based on the assumption\nthat something exists?\n \nAnd wouldn\'t you say there is a level of definition that the assumption\n"god is" is meaningful. If not, I would reject that concept anyway.\n \nSo, where is your evidence for that "god is" is meaningful at some level?\n   Benedikt\n']transfer_test_data = None#   请在此添加实现代码   ## ********** Begin *********#tfidf_vertor = TfidfVectorizer(min_df=2, stop_words="english")tfidf_vertor.fit(X)transfer_test_data = tfidf_vertor.transform(test_data).toarray()# ********** End **********#return transfer_test_data

第4关:使用scikit-learn分类器SVM对digits数据分类

本关必读

在scikit-learn中,对于分类问题的估计器是一个实现了fit(X, y)predict(T)方法的Python对象。估计器的实例很多,例如实现了支持向量分类的类sklearn.svm.svc。估计器的结构可以通过初始化模型时设置的参数决定,但目前,我们将估计器看做一个黑盒子,先不关心具体的参数设置。 digits数据集中包含大量的数字图片,如下图所示,我们希望给定其中的一张图片,能识别图中代表的数字,这是一个分类问题,数字0…9代表十个分类,目标是希望能正确估计图中样本属于哪一个数字类别。

Digits数据集可以通过以下命令导入:

 
  1. from sklearn import datasets
  2. digits = datasets.load_digits()

digits的原始图像采用一个(8,8)的二维数组表示,如下图所示:

可以通过digits.data查看图片数据表示,行表示样本数量,列表示样本特征(将(8,8)的矩阵压缩成一行,可以从digits.data.shape的列数为64维看出,);digits.target给出digits数据集的真实值,即我们要学习的每个数字图像对应的数字。

本关任务

本关要求采用scikit-learn中的svm模型训练一个对digits数据集进行分类的模型。训练集是digits数据集的前半部分数据,测试集是digits数据集的后半部分数据。

 
  1. # 使用前一半的数据集作为训练数据,后一半数据集作为测试数据
  2. train_data,train_target = data[:n_samples // 2],digits.target[:n_samples // 2]
  3. test_data,test_target = data[n_samples // 2:],digits.target[n_samples // 2:]

希望通过训练集训练出分类模型,对于测试集数据能正确预测出图片对应的数字(0…9)。 本关需编程实现step2/digitsClassification.pycreateModelandPredict()函数创建分类模型并预测:

 
  1. def createModelandPredict():
  2. '''
  3. 创建分类模型并对测试数据预测
  4. 返回值:
  5. predicted - 测试数据预测分类值
  6. '''
  7. predicted = None
  8. #   请在此添加实现代码   #
  9. #********** Begin *********#
  10.  
  11. #********** End **********#
  12. return predicted

predicted 是模型对测试数据的预测值,该函数会返回预测值并在测试文件中检测是否正确。 另外,step2/digitsClassification.py代码中包含两个显示样本图像的函数分别是show4TrainImage()show4TestImage(),分别用来显示训练集的前4张图像,和模型预测值的前4张图像,大家可以通过在本机python环境调用这两个函数直观查看原始样本集,并且验证预测是否正确,如下图所示:

拓展(本次不需要实现): 从预测集的图像可以看出,并不是完全预测正确,这一点是很正常的,说明使用默认的svc训练模型的无法完全将测试集正确分类,可以通过调整模型的参数使分类更准确,大家可以尝试下设置参数gamma=0.001重新训练模型并预测看是否准确。

测试说明

本关的测试文件是step2/testDigitsClassification.py该代码负责对你的实现代码进行测试,注意step2/testDigitsClassification.py 不能被修改,该测试代码具体如下:

 
  1. import digitsClassification
  2. pred = digitsClassification.createModelandPredict()
  3. print(pred[:10])

测试函数将直接调用step2/createModelandPredict.pycreateModelandPredict()得到实际输出,即分类模型的预测值,平台通过比较预期输出与实际输出的前10个值来判断createModelandPredict函数是否实现正确。

import matplotlib.pyplot as plt
# 导入数据集,分类器相关包
from sklearn import datasets, svm, metrics# 导入digits数据集
digits = datasets.load_digits()
n_samples = len(digits.data)
data = digits.data# 使用前一半的数据集作为训练数据,后一半数据集作为测试数据
train_data,train_target = data[:n_samples // 2],digits.target[:n_samples // 2]
test_data,test_target = data[n_samples // 2:],digits.target[n_samples // 2:]def createModelandPredict():'''创建分类模型并对测试数据预测返回值:predicted - 测试数据预测分类值'''predicted = None#   请在此添加实现代码   ##********** Begin *********#classifier = svm.SVC()classifier.fit(train_data,train_target)predicted = classifier.predict(test_data)#********** End **********#return predicted

第5关:模型持久化

本关必读

当数据量很大的时候,训练一个模型需要消耗很大的时间成本,每次都重新训练模型预测是非常冗余且没有必要的,我们可以将训练模型存储下来,每当要预测新数据的时候只需加载该模型。
训练模型的持久化需要调用python的内建模块picklepickle可以用来将python对象转化为字节流存储至磁盘,也可以逆向操作将磁盘上的字节流恢复为python对象。pickle的常用函数包括:

 
  1. #将对象obj写到文件file中
  2. pickle.dump(obj, file[, protocol])
  3. #从文件file读取数据流并将其重建返回原始对象
  4. pickle.load(file)

关于pickle的详细使用可以参考官方文档:11.1. pickle — Python object serialization — Python 2.7.18 documentation

python 文件操作:

 
  1. open(路径+文件名,读写模式)

读写模式:
r:只读;
r+:读写;
w:新建(会覆盖原有文件);
a:追加;
b:二进制文件;
示例:

 
  1. #打开本地file文件,并开启写模式
  2. fw=open('file', 'wb')
  3. #向file文件中写入‘hello,world’
  4. fw.write('hello,world')
  5. #打开file文件并读取其中内容
  6. fw=open('file', 'rb')
  7. fw.read()

‘wb’,'rb'分别表示以二进制流的方式进行写入和读取。 ####本关任务 本关在上一关的基础上,希望将分类模型存储下来,当需要预测数据时加载该模型返回预测值。
本关需编程实现step3/dumpClassificationModel.pydumpModel()函数存储分类模型,并且实现loadModel()函数来加载存储模型对预测数据分类,分类模型的实现在createModel()函数中:

 
  1. # 导入数据集,分类器相关包
  2. from sklearn import datasets, svm, metrics
  3. import pickle
  4. # 导入digits数据集
  5. digits = datasets.load_digits()
  6. n_samples = len(digits.data)
  7. data = digits.data
  8. # 使用前一半的数据集作为训练数据,后一半数据集作为测试数据
  9. train_data,train_target = data[:n_samples // 2],digits.target[:n_samples // 2]
  10. test_data,test_target = data[n_samples // 2:],digits.target[n_samples // 2:]
  11. def createModel():
  12. classifier = svm.SVC()
  13. classifier.fit(train_data,train_target)
  14. return classifier
  15. local_file = 'dumpfile'
  16. def dumpModel():
  17. '''
  18. 存储分类模型
  19. '''
  20. clf = createModel()
  21. #   请在此添加实现代码   #
  22. #********** Begin *********#
  23.  
  24. #********** End **********#
  25. def loadModel():
  26. '''
  27. 加载模型,并使用模型对测试数据进行预测,返回预测值
  28. 返回值:
  29. predicted - 模型预测值
  30. '''
  31. predicted = None
  32. #   请在此添加实现代码   #
  33. #********** Begin *********#
  34.  
  35. #********** End **********#
  36. return predicted

实现提示:
local_file对应即将存储在平台的文件的名称。dumpModel()函数中首先需要打开local_file文件,并开启写入模式,再使用pickle模块将模型存储下来,loadModel()函数中也需要先打开local_file文件,开启读取模式,再使用pickle将local_file文件中存储的模型load至模型变量中,再使用该模型预测。

测试说明

本关的测试文件是step3/testDigitsClassification.py该代码负责对你的实现代码进行测试,注意该测试不能被修改,该测试代码具体如下:

 
  1. import dumpClassificationModel
  2. import os
  3. dumpClassificationModel.dumpModel()
  4. if os.path.exists('dumpfile'):
  5. print("dump success")
  6. else:
  7. print("dump fail")
  8. predicted = dumpClassificationModel.loadModel()
  9. print(predicted[:10])

测试函数将直接调用step3/dumpClassificationModel.pydumpModel()存储模型,并检测平台是否存在该文件,然后调用loadModel()函数得到模型实际预测值,平台通过比较预期输出与实际输出的前10个值来判断成功加载模型并预测。

# 导入数据集,分类器相关包
from sklearn import datasets, svm, metrics
import pickle
# 导入digits数据集
digits = datasets.load_digits()
n_samples = len(digits.data)
data = digits.data
# 使用前一半的数据集作为训练数据,后一半数据集作为测试数据
train_data,train_target = data[:n_samples // 2],digits.target[:n_samples // 2]
test_data,test_target = data[n_samples // 2:],digits.target[n_samples // 2:]
def createModel():classifier = svm.SVC()classifier.fit(train_data,train_target)return classifier
local_file = 'dumpfile'
def dumpModel():clf = createModel()# 请在此处补全模型存储语句f_model=open(local_file,'wb')pickle.dump(clf,f_model)
def loadModel():predicted = None# 请在此处补全模型加载语句,并对预测数据分类返回预测值f_model = open(local_file, 'rb')clf = pickle.loads(f_model.read())predicted = clf.predict(test_data)return predicted

第6关:模型评估-量化预测效果

本关任务

在前面的关卡,我们已经学会了如果使用sklearn训练分类模型,那如何评估模型的分类效果?本关卡将学会使用sklearn的模型度量方法,来量化预测结果。

相关知识

sklearn中有三种不同的API来评估模型的预测质量:

  • Estimator score method :在评估器(比如一个分类模型)中有score函数提供默认的评估标准,比如支持向量机sklearn.svm.SVC中的score函数通过计算预测准确率来评估模型,如下图所示。

  • Scoring parameter:cross-validation的模型评估工具比如model_selection.GridSearchCV,可通过设置类的参数scoring来指定评估模型,如下图所示。

  • Metric functions: metrics模块实现了一些函数,用来评估预测误差,并且针对不同的目标(分类、回归或聚类问题等)有不同的评估类,具体如下图所示。

前两种评估方法可以在具体的评估器和交叉验证工具中设置,在这里不过多讨论。我们主要关注metrics模块,旨在让同学们学会如何使用常见的指标对分类结果分析评价。

sklearn.metrics的详细使用可参考官方文档,以下将简单介绍几种常用的评价指标。

  • accu\fracy_score(y_true, y_pred, normalize=True, sample_weight=None)
    计算分类精度,示例如下图所示:

    其中 normalize=True时返回正确分类的比例,设为False时返回正确分类的样本个数。

  • recall_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None) 返回模型分类的召回率,示例如下图所示:

    参数:
    y_true:实际值
    y_pred:预测值
    pos_label: 仅当average=’binary’时该参数才有效,即仅对二分类有效。参数的值为正类标签或负类标签,指定计算的是正类还是负类
    average:当涉及到二分类/多分类/多标签等不同的问题时,可以通过设置该参数指定计算方式,可取的值包括[None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]

  • f1_scoreprecision_score的使用方式和recall_score类似。

  • confusion_matrix
    计算混淆矩阵,示例如下图所示:

  • classification_report
    该函数建立了一份文本报告展示主要的分类度量指标,比如准确率、召回率、f1值等。示例如下图所示:

  • precision_recall_fscore_support
    为每个类别计算准确率、召回率、f值、support值,示例如下图所示:

编程要求

本次任务希望对二分类和多分类模型进行评估,本关具体分成为两个子任务:
1.评估二分类模型:训练数据集为二类别数据,通过构建简单的svm模型(初始化模型在代码中已给出),对测试数据进行预测,并返回模型正确分类的样本个数、正类的预测准确率、正类的召回率、正类的f值。该样本数据中y = {1,-1},1表示正类,-1表示负类。

要补充的代码块如下:

 
  1. def bin_evaluation(X_train, y_train, X_test, y_test):
  2. '''
  3. 评估二分类模型
  4. :param X_train: 训练数据集
  5. :param y_train: 训练集类别
  6. :param X_test: 测试数据集
  7. :param y_test: 测试集实际类别
  8. :return:
  9. correct_num - 正确分类的样本个数
  10. prec - 正类的准确率
  11. recall - 正类的召回率
  12. f_score - 正类的f值
  13. '''
  14. classifier = LinearSVC()
  15. correct_num, prec, recall, fscore = None, None, None, None
  16. #   请在此添加实现代码   #
  17. # ********** Begin *********#
  18. # ********** End **********#

2.评估多分类模型:数据集为多类别数据,通过构建简单的svm模型(初始化模型在代码中已给出),对测试数据进行预测,并返回模型的精度、准确率和f值。其中准确率和f值的计算方式设定为‘macro’。

要补充的代码块如下:

 
  1. def multi_evaluation(X_train,y_train,X_test,y_test):
  2. '''
  3. 评估多分类模型
  4. :param X_train: 训练数据集
  5. :param y_train: 训练集类别
  6. :param X_test: 测试数据集
  7. :param y_test: 测试集实际类别
  8. :return:
  9. acc - 模型的精度
  10. prec - 准确率
  11. f_score - f值
  12. '''
  13. #初始化
  14. acc,prec,f_score = None,None,None
  15. classifier = SVC(kernel='linear')
  16. #   请在此添加实现代码   #
  17. # ********** Begin *********#
  18. # ********** End **********#
测试说明

本关卡的测试数据来自./step6/testMetrics.py文件,平台将比对您所编写函数的返回值与正确的数值,只有所有数据全部计算正确才能进入下一关。

from sklearn.metrics import recall_score,accuracy_score,precision_score,f1_score,precision_recall_fscore_support
from sklearn.svm import LinearSVC,SVC
def bin_evaluation(X_train, y_train, X_test, y_test):'''评估二分类模型:param X_train: 训练数据集:param y_train: 训练集类别:param X_test: 测试数据集:param y_test: 测试集实际类别:return:correct_num - 正确分类的样本个数prec - 正类的准确率recall - 正类的召回率f_score - 正类的f值'''classifier = LinearSVC()correct_num, prec, recall, fscore = None, None, None, None#   请在此添加实现代码   ## ********** Begin *********##训练分类器classifier.fit(X_train,y_train)#使用分类器y_predicted = classifier.predict(X_test)#测试分类器correct_num =  accuracy_score(y_test,y_predicted,normalize=False)prec =   precision_score(y_test,y_predicted) recall =  recall_score(y_test,y_predicted,average ='binary')fscore = f1_score(y_test,y_predicted)return correct_num,prec,recall,fscore# ********** End **********#
def multi_evaluation(X_train,y_train,X_test,y_test):'''评估多分类模型:param X_train: 训练数据集:param y_train: 训练集类别:param X_test: 测试数据集:param y_test: 测试集实际类别:return:acc - 模型的精度prec - 准确率f_score - f值'''#初始化acc,prec,f_score = None,None,Noneclassifier = SVC(kernel='linear')#   请在此添加实现代码   ## ********** Begin *********##训练分类器classifier.fit(X_train,y_train)#使用分类器y_predicted = classifier.predict(X_test)#测试分类器acc =  accuracy_score(y_test,y_predicted)prec =   precision_score(y_test,y_predicted,average ='macro') f_score = f1_score(y_test,y_predicted,average ='macro')return acc,prec,f_score# ********** End **********#

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

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

相关文章

JAVA面试八股文之数据库

MySQL面试题 MySQL 存储引擎架构了解吗?CHAR 和 VARCHAR 的区别是什么?索引是越多越好嘛?MySQL数据库中空值(null)和空字符串()的区别?SQL 中 on 条件与 where 条件的区别&#xff1…

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…

腾讯云4核8G服务器多少钱?4核8G能干啥?

腾讯云4核8G服务器多少钱?腾讯云4核8G轻量应用服务器12M带宽租用价格646元15个月,活动页面 txybk.com/go/txy 活动链接打开如下图所示: 腾讯云4核8G服务器优惠价格 这台4核8G服务器是轻量应用服务器,详细配置为:轻量4核…

前端代码优化--computed

随便记录一下 主要是通过计算属性来简化和优化代码。在 Vue 中,计算属性是一种方便的工具,可以让你根据依赖状态的变化来动态计算衍生值。在这个例子中,我们使用计算属性 formattedCommunicationType 来根据 workDetail.realTimeItemDeviceDT…

openlayer实现webgis端绘制制图及编辑

在WebGIS端制图是指通过Web浏览器界面实现地理信息数据的可视化、编辑、分析以及地图产品的制作。这一过程通常涉及以下几个关键环节: **1. 前端技术栈: •HTML/CSS/JavaScript:作为Web开发的基础,用于构建用户界面布局、样式设…

Win11又来「重大」更新!

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站ai人工智能工具 更多资源欢迎关注 Windows 11预览通道的22635.3420版本迎来了几个比较大的改进,主要有三个方面: …

一种快速移植 OpenHarmony Linux 内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者,介绍一种借助三方芯片平台自带 Linux 内核的现有能力,快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

python-study-day1-(病人管理系统-带sql)

MainWindow代码 from tkinter import * from tkinter import messagebox from tkinter.ttk import Comboboxclass MianWindow(Frame):def __init__(self, masterNone):super().__init__(master, padx30, pady20)self.flag 0self.pack(expandTrue, fillBOTH)self.id StringVa…

深入OceanBase内部机制:系统架构与组件精讲

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 1️⃣OceanBase 整体架构1.1 分区1.2 分片1.3 日志流1.4 对等节点1.5 多租户 2️⃣OceanBase 架构与组件详解2.1 存储层2.2 …

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件:使用 Recovery Vault 轻松保护文件免遭意外删除,并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备,文件类型和文件系统。 软件下载:Disk Drill Enterprise for Mac v5.5.1515激…

keepalived2.2.8+drbd9+nfs高可用存储部署

目录 一.本文基于上一篇文章keepalived环境来做的,主机信息如下 二.为两台虚拟机准备添加一块新硬盘设备 三.安装drbd9 1.使用扩展源的rpm包来下载 2.创建资源并挂载到新增的硬盘 3.主设备升级身份 4.主备两个设备手动切换身份演示 四.安装配置nfs 五.安装…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层,构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征,有利于将不同…

大话设计模式——24.迭代器模式(Iterator Pattern)

简介 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部实现。(Java中使用最多的设计模式之一) UML图 应用场景 Java的集合对象:Collection、List、Map、Set等都有迭代器Java ArrayList的迭代器源码 示例 简…

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳(纯属个人感觉) 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目(这里需要在hbuilder创建) vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…

Jackson配置处理LocalDateTime、LocalDate等java8时间类型失效的问题解决

目录 前言 一、问题排查过程 1.1 SpringMvc是如何处理请求报文和响应报文 1.2 JacksonConfig配置排查 二、导致Jackson配置失效的原因 2.1 没有addSerializer 2.2 添加了EnableMvc注解 2.3 另外有地方配置了Jacksonhttpconver覆盖了配置 总结 前言 上一篇文章《使用Ja…

C/C++的内存管理

栈帧最主要的作用就是存储局部数据 C语言中动态内存管理方式 C语言动态内存管理 该篇详细的讲述了C语言动态内存管理的使用,不太懂的小伙伴可以去了解一下 C中动态内存管理方式 首先,C语言内存管理的方式在C中可以继续使用。但有些地方就无能为力而且使用…

Volatility-内存取证案例1-writeup--xx大赛

题目提示:flag{中文} 按部就班 (1)获取内存镜像版本信息 volatility -f 文件名 imageinfo 通过上述可知,镜像版本为Win7SP1X64。 (2)获取进程信息: volatility -f 镜像名 --profile第一步获取…

关于AI Agent、RAG技术揭秘:如何让人工智能更懂你?

人工智能技术正以前所未有的速度改变着我们的世界。从深度学习算法的突破到自动化和机器学习技术的进步。在这个变革的时代,几种前沿技术尤其引人注目,其中包括RAG(Retrieval-Augmented Generation)、AI Agent以及多模态技术。 近…

工频磁场抗扰度概述及相关注意事项

工频磁场 是指交流输变电设施产生的磁场,工频又称电力频率。 工频的特点是频率低、波长长;我国工频是50赫(Hz),波长是6000千米(Km) 工频磁场的抗扰度试验(在有电流流过的地方都会伴生磁场,为了检查设备或系…