文章目录

  • 处理文本数据
    • 用字符串表示的数据类型
    • 电影评论的情感分析
    • 将文本数据表示为词袋
      • 将词袋应用于玩具数据集
      • 将词袋应用于电影评论
    • 停用词
    • 用td-idf缩放数据
    • 多个单词的词袋(n元分词)
    • 高级分词、词干提取与词形还原
    • 主题建模与文档聚类
    • 小结与展望

处理文本数据

表示数据属性的两种类型的特征:连续特征和分类特征,前者用于描述数量,后者是固定列表中的元素。在许多应用中还可以见到第三种类型的特征:文本。文本数据通常被表示为由字符组成的字符串。在上面给出的所有例子中,文本数据的长度可能都不相同。这个特征显然与前面讨论过的数值特征由很大的不同,我们需要先处理数据然后才能对其应用机器学习算法。

用字符串表示的数据类型

文本通常只是数据集中的字符串,并非所有字符串特征都应该被当作文本来处理。
可能遇到的四种类型的字符串数据:
分类数据,可以在语义上映射为类别的自由字符串,结构化字符串数据,文本数据。
分类数据(categorical data)是来自固定列表的数据。可以在语义上映射为类别的自由字符串:折中字符串预处理过程可能需要大量的人力,并且不容易自动化。文本数据(text data),由短语或句子组成。在文本分析的语境中,数据集通常被称为语料库,每个由单个文本表示数据点被称为文档。这些术语来自于信息检索和自然语言处理的社区。

电影评论的情感分析

电影评论数据集:4 这个数据集包含评论文本,还有一个标签,用于表示该评论是“正面(positive)还是“负面的”(negative)。为了简化建模,这些评论打分被归纳为一个二分类数据集,评分大于7的被标记为正面的,评论小于4的被标记为负面的,中性评论没有包含在数据集中。我们不讨论这种方法是否是一种好的数据表示,只是使用这个数据。
将数据解压之后,数据集包含两个独立文件夹中的文本文件,一个是训练数据一个是测试数据。每个文件夹又都包含两个子文件夹,一个叫做pos,一个叫做neg。pos文件夹包含所有正面的评论,每条评论都是一个单独的文本文件,neg文件夹与之类似。scikit-learn中有一个辅助韩叔叔可以加载这种文件夹结构保存的文件,其中每个子文件夹对应于一个标签,这个函数叫做load_files。

将文本数据表示为词袋

用于机器学习的文本表示有一种最简单的方法,也是最有效的且常用的方法,使用词袋表示。使用这种表示方式时,我们舍弃了输入文本中的大部分结构,如章节、段落、句子和格式,只计算语料库中每个单词在每个文本中出现的频次。
对于文档语料库,计算词袋表示包括以下三个步骤:
1.分词:将每个文档划分为出现在其中的单词,比如:按空格和标点划分。
2.构建词表:收集一个词表。里面包含出现在任意文档中的所有词并对它们进行编号(按字母顺序进行排序)。
3.编码:对于每个文档,计算词表中每个单词在该文档中出现的频次。

输出时包含每个文档中单词计数的一个向量。对于词表中的每个单词,我们都有它在每个文档中的出现词素和。也就是说整个数据集中的每个唯一单词都对应于这种数值表示的一个特征。请注意,原始字符串中的单词顺序与词袋特征表示完全无关。

将词袋应用于玩具数据集

词袋表示是在 CountVectorizer 中实现的,它是一个变换器(transformer)。我们首先将它应用于一个包含两个样本的玩具数据集,来看一下它的工作原理。

# 玩具数据集
bards_words =["The fool doth think he is wise,","but the wise man knows himself to be a fool"]# 导入 CountVectorizer 并将其实例化,然后对玩具数据进行拟合
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer()
vect.fit(bards_words)# 拟合 CountVectorizer 包括训练数据的分词与词表的构建,我们可以通过 vocabulary_ 属性来访问词表
print("Vocabulary size: {}".format(len(vect.vocabulary_)))
print("Vocabulary content:\n {}".format(vect.vocabulary_))# 可以调用 transform 方法来创建训练数据的词袋表示
bag_of_words = vect.transform(bards_words)
print("bag_of_words: {}".format(repr(bag_of_words)))# 要想查看稀疏矩阵的实际内容,可以使用 toarray 方法将其转换为“密集的”NumPy 数组
print("Dense representation of bag_of_words:\n{}".format(bag_of_words.toarray()))运行结果:
Vocabulary size: 13
Vocabulary content:{'the': 9, 'fool': 3, 'doth': 2, 'think': 10, 'he': 4, 'is': 6, 'wise': 12, 'but': 1, 'man': 8, 'knows': 7, 'himself': 5, 'to': 11, 'be': 0}
bag_of_words: <2x13 sparse matrix of type '<class 'numpy.int64'>'with 16 stored elements in Compressed Sparse Row format>
Dense representation of bag_of_words:
[[0 0 1 1 1 0 1 0 0 1 1 0 1][1 1 0 1 0 1 0 1 1 1 0 1 1]]

词袋表示保存在一个SciPy稀疏矩阵中,这种数据格式只保存非零元素。这个矩阵的形状是2*13,每行对应于两个数据点之一,每个特征对应于此表种的一个单词,这里使用稀疏矩阵,是因为大多数文档都只包含词表中的一个单词。也就是说特征数组中的大部分元素都为0。
每个单词的计数都是 0 或 1。bards_words 中的两个字符串都没有包含相同的单词。第一个字符串(“The fool doth think he is wise,”)被表示为第一行,对于词表中的第一个单词 “be”,出现 0 次。对于词表中的第二个单词 “but”,出现 0 次。对于词表中的第三个单词 “doth”,出现 1 次,以此类推。通过观察这两行可以看出,第 4 个单词 “fool”、第 10 个单词 “the” 与第 13 个单词 “wise” 同时出现在两个字符串中。

将词袋应用于电影评论

# 应用于电影评论数据集
vect = CountVectorizer().fit(text_train)
X_train = vect.transform(text_train)
print("X_train:\n{}".format(repr(X_train)))'''
访问词表的另一种方法是使用向量器(vectorizer)的 get_feature_name 方法,
它将返回一个列表,每个元素对应于一个特征
'''
feature_names = vect.get_feature_names()
print("Number of features: {}".format(len(feature_names)))
print("First 20 features:\n{}".format(feature_names[:20]))
print("Features 20010 to 20030:\n{}".format(feature_names[20010:20030]))
print("Every 2000th feature:\n{}".format(feature_names[::2000]))'''
单数和复数形式都包含在词表中,并且作为不同的单词
这些单词具有密切相关的语义,将它们作为不同的单词进行计数(对应于不同的特征)可能不太合适
在尝试进行特征提取之前,先通过实际构建一个分类器来得到性能的量化度量。我们将训练标签保存在y_train中
训练数据的词袋表示保存在x_train中,因此我们可以在这个数据上训练一个分类器
'''
# 对于这样的高维稀疏数据,类似 LogisticRegression 的线性模型通常效果最好
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
scores = cross_val_score(LogisticRegression(), X_train, y_train, cv=5)
print("Mean cross-validation accuracy: {:.2f}".format(np.mean(scores)))# LogisticRegression 有一个正则化参数 C,我们可以通过交叉验证来调节它
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10]}
grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("Best cross-validation score: {:.2f}".format(grid.best_score_))
print("Best parameters: ", grid.best_params_)# 在测试集上评估这个参数设置的泛化性能
X_test = vect.transform(text_test)
print("{:.2f}".format(grid.score(X_test, y_test)))# 改进单词提取
vect = CountVectorizer(min_df=5).fit(text_train)
X_train = vect.transform(text_train)
print("X_train with min_df: {}".format(repr(X_train)))# 再次运行网格搜索
grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("Best cross-validation score: {:.2f}".format(grid.best_score_))运行结果:
Mean cross-validation accuracy: 0.70
Best cross-validation score: 0.71
Best parameters:  {'C': 0.01}
0.78
X_train with min_df: <33631x31371 sparse matrix of type '<class 'numpy.int64'>'with 4525004 stored elements in Compressed Sparse Row format>Best cross-validation score: 0.71

停用词

删除没有信息量的单词还有另一种方法就是舍弃哪些出现次数太多以至于没有信息量的单词。主要有两种方法:使用特定语言的停用词列表或者舍弃哪些出现过于频繁的单词.

# scikit-learn 的 feature_extraction.text 模块中提供了英语停用词的内置列表
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
print("Number of stop words: {}".format(len(ENGLISH_STOP_WORDS)))
print("Every 10th stopword:\n{}".format(list(ENGLISH_STOP_WORDS)[::10]))# 指定stop_words="english"将使用内置列表。
# 我们也可以扩展这个列表并传入我们自己的列表。
vect = CountVectorizer(min_df=5, stop_words="english").fit(text_train)
X_train = vect.transform(text_train)
print("X_train with stop words:\n{}".format(repr(X_train)))grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("Best cross-validation score: {:.2f}".format(grid.best_score_))运行结果:
Number of stop words: 318
Every 10th stopword:
['down', 'amongst', 'eleven', 'any', 'whereas', 'made', 'anyone', 'hundred', 'nine', 'these', 'me', 'must', 'herein', 'much', 'my', 'also', 'full', 'else', 'your', 'six', 'take', 'neither', 'all', 'with', 'detail', 'first', 'own', 'yours', 'still', 'across', 'anywhere', 'whom']
X_train with stop words:
<33631x31064 sparse matrix of type '<class 'numpy.int64'>'with 2911524 stored elements in Compressed Sparse Row format>Best cross-validation score: 0.73

用td-idf缩放数据

按照我们预计的特征信息量的大小来缩放特征,最常见的做法是使用td-idf。如果一个单词在某个特定文档中经常出现,但在许多文档中却不常出现,那么这个单词很可能是对文档的很好的描述。scikit-learn 在两个类中实现了 tf-idf 方法:TfidfTransformer 和TfidfVectorizer,前者接受 CountVectorizer 生成的稀疏矩阵并将其变换,后者接受文本数据并完成词袋特征提取与 tf-idf 变换。

其中 N 是训练集中的文档数量,Nw 是训练集中出现单词 w 的文档数量,tf(词频)是单词w 在查询文档 d(你想要变换或编码的文档)中出现的次数。两个类在计算 tf-idf 表示之后都还应用了 L2 范数。换句话说,它们将每个文档的表示缩放到欧几里得范数为 1。利用这种缩放方法,文档长度(单词数量)不会改变向量化表示。

# td-idf
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(TfidfVectorizer(min_df=5),LogisticRegression())
param_grid = {'logisticregression__C': [0.001, 0.01, 0.1, 1, 10]}
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(text_train, y_train)
print("Best cross-validation score: {:.2f}".format(grid.best_score_))# 从管道中提取 TfidfVectorizer
vectorizer = grid.best_estimator_.named_steps["tfidfvectorizer"]
# 变换训练数据集
X_train = vectorizer.transform(text_train)
# 找到数据集中每个特征的最大值
max_value = X_train.max(axis=0).toarray().ravel()
sorted_by_tfidf = max_value.argsort()
# 获取特征名称
feature_names = np.array(vectorizer.get_feature_names())
print("Features with lowest tfidf:\n{}".format(feature_names[sorted_by_tfidf[:20]]))
print("Features with highest tfidf: \n{}".format(feature_names[sorted_by_tfidf[-20:]]))# 找到逆向文档频率较低的单词,即出现次数很多,因此被认为不那么重要的单词
# 训练集的逆向文档频率值被保存在 idf_ 属性中sorted_by_idf = np.argsort(vectorizer.idf_)
print("Features with lowest idf:\n{}".format(feature_names[sorted_by_idf[:100]]))运行结果:
Best cross-validation score: 0.74Features with lowest tfidf:
['suplexes' 'intriguingly' 'rifleman' 'submits' 'gauche' 'underhanded''rebuffs' 'hypocrites' 'embodying' 'galadriel' 'pebbles' 'expensively''mclaughlin' 'sylvain' 'oversee' 'trembling' 'schemer' 'sharpshooter''reverting' 'profited']
Features with highest tfidf:
['zatoichi' 'bye' 'botched' 'dev' 'colombo' 'sasquatch' 'woo' 'xica''darkman' 'casper' 'wei' 'log' 'doodlebops' 'smallville' 'skulls' 'nr''steve' 'scanners' 'pokemon' 'click']
Features with lowest idf:
['the' 'and' 'of' 'to' 'this' 'is' 'it' 'in' 'that' 'but' 'for' 'with''as' 'was' 'on' 'movie' 'not' 'one' 'be' 'have' 'film' 'are' 'you' 'all''at' 'an' 'by' 'from' 'so' 'like' 'who' 'his' 'they' 'there' 'out' 'if''about' 'just' 'he' 'or' 'has' 'what' 'good' 'some' 'can' 'when' 'more''very' 'time' 'up' 'see' 'only' 'even' 'my' 'would' 'no' 'story' 'well''really' 'which' 'had' 'me' 'much' 'their' 'than' 'get' 'great' 'other''were' 'also' 'been' 'most' 'do' 'her' 'first' 'into' 'will' 'don' 'how''made' 'because' 'people' 'make' 'way' 'we' 'could' 'after' 'too' 'them''any' 'then' 'she' 'bad' 'movies' 'watch' 'think' 'seen' 'its' 'him''acting']

使用td-idf代替仅统计词数对性能有所提高,我们还可以擦行看tf-idf找到的最重要的单词。td-idf缩放的目的是找到能够区分文档的单词,但他完全是一种无监督技术。因此,这里‘重要’不一定与我们感兴趣的正面评论和负面评论标签相关。tf-idf较小的特征要么是在许多文档里很实用,要么就是很少使用,且仅出现在非常长的文档中。许多tf-idf较大的特征实际上对应的是特定的演出或电影。这些术语仅出现在这这些特定演出或电影的评论中,但往往这写评论中多次出现。这些单词不太可能有助于我们的情感分类任务,但可能包含了关于评论的大量具体信息。

多个单词的词袋(n元分词)

使用词袋表示的主要的缺点之一就是完全舍弃了单词的顺序。在使用词袋表示时有一种获取上下文的方法,就是不仅考虑单一词例的计数,而且考虑相邻的两个或三个词例的计数。两个词例被称为二元分词,三个词例被称为三元分词,更一般的词例序列被称为n元分词。我们可以通过改变 CountVectorizer 或 TfidfVectorizer的 ngram_range 参数来改变作为特征的词例范围。ngram_range 参数是一个元组,包含要考虑的词例序列的最小长度和最大长度。

对于大多数应用而言,最小的词例数量应该是 1,因为单个单词通常包含丰富的含义。在大多数情况下,添加二元分词会有所帮助。添加更长的序列(一直到五元分词)也可能有所帮助,但这会导致特征数量的大大增加,也可能会导致过拟合,因为其中包含许多非常具体的特征。原则上来说,二元分词的数量是一元分词数量的平方,三元分词的数量是一元分词数量的三次方,从而导致非常大的特征空间。在实践中,更高的 n 元分词在数据中的出现次数实际上更少,原因在于(英语)语言的结构,不过这个数字仍然很大。

高级分词、词干提取与词形还原

词表中通常包含某些单词的单数形式和复数形式,对于词袋模型而言,语义非常接近,区分二者只会增加过拟合,导致模型无法充分利用训练数据。同样我们还发现,词表中包含像 “replace”、“replaced”、“replacement”、“replaces” 和 “replacing” 这样的单词,它们都是动词“to replace”的不同动词形式或相关名词。与名词的单复数形式一样,将不同的动词形式及相关单词视为不同的词例,这不利于构建具有良好泛化性能的模型。
可以通过用词干来表示每个单词来解决。这一方法涉及找出所有具有相同词干的单词。如果使用基于规则的启发法来实现,那么通常将其称为词干提取,如果使用的是由已知单词形式组成的字典,并且考虑了单词在句子中的作用,那么这个过程被称为词形还原,单词的标准化形式称为词元。词干提取和词形还原这两种处理方法都是标准化的形式之一,标准化是指尝试提取一个单词的某种标准化形式。标准化的另一个例子是拼写校正。

import spacy
import nltk
# 加载spacy的英语模型
en_nlp = spacy.load('en')
# 将nltk的Porter词干提取器实例化
stemmer = nltk.stem.PorterStemmer()
# 定义一个函数来对比spacy中的词形还原与nltk中的词干提取
def compare_normalization(doc):# 在spacy中对文档进行分词doc_spacy = en_nlp(doc)# 打印出spacy找到的词元print("Lemmatization:")print([token.lemma_ for token in doc_spacy])# 打印出Porter词干提取器找到的词例print("Stemming:")print([stemmer.stem(token.norm_.lower()) for token in doc_spacy])compare_normalization(u"Our meeting today was worse than yesterday, ""I'm scared of meeting the clients tomorrow.")
运行结果:
Lemmatization:
['our', 'meeting', 'today', 'be', 'bad', 'than', 'yesterday', ',', 'i', 'be','scared', 'of', 'meet', 'the', 'client', 'tomorrow', '.']
Stemming:
['our', 'meet', 'today', 'wa', 'wors', 'than', 'yesterday', ',', 'i', "'m",'scare', 'of', 'meet', 'the', 'client', 'tomorrow', '.']

词干提取总是局限于将单词简化成词干,因此 “was” 变成了 “wa”,而词形还原可以得到正确的动词基本词形 “be”。同样,词形还原可以将 “worse” 标准化为 “bad”,而词干提取得到的是 “wors”。另一个主要区别在于,词干提取将两处 “meeting” 都简化为 “meet”。利用词形还原,第一处 “meeting” 被认为是名词,所以没有变化,而第二处"meeting" 被认为是动词,所以变为 “meet”。一般来说,词形还原是一个比词干提取更复杂的过程,但用于机器学习的词例标准化时通常可以给出比词干提取更好的结果。

'''
虽然 scikit-learn 没有实现这两种形式的标准化,但 CountVectorizer 允许使用 tokenizer
参数来指定使用你自己的分词器将每个文档转换为词例列表。我们可以使用 spacy 的词形
还原了创建一个可调用对象,它接受一个字符串并生成一个词元列表
'''
# 技术细节:我们希望使用由CountVectorizer所使用的基于正则表达式的分词器,
# 并仅使用spacy的词形还原。
# 为此,我们将en_nlp.tokenizer(spacy分词器)替换为基于正则表达式的分词。
import re
# 在CountVectorizer中使用的正则表达式
regexp = re.compile('(?u)\\b\\w\\w+\\b')
# 加载spacy语言模型,并保存旧的分词器
en_nlp = spacy.load('en')
old_tokenizer = en_nlp.tokenizer
# 将分词器替换为前面的正则表达式
en_nlp.tokenizer = lambda string: old_tokenizer.tokens_from_list(regexp.findall(string))
# 用spacy文档处理管道创建一个自定义分词器
# (现在使用我们自己的分词器)
def custom_tokenizer(document):doc_spacy = en_nlp(document, entity=False, parse=False)return [token.lemma_ for token in doc_spacy]
# 利用自定义分词器来定义一个计数向量器
lemma_vect = CountVectorizer(tokenizer=custom_tokenizer, min_df=5)# 利用带词形还原的CountVectorizer对text_train进行变换
X_train_lemma = lemma_vect.fit_transform(text_train)
print("X_train_lemma.shape: {}".format(X_train_lemma.shape))
# 标准的CountVectorizer,以供参考
vect = CountVectorizer(min_df=5).fit(text_train)
X_train = vect.transform(text_train)
print("X_train.shape: {}".format(X_train.shape))运行结果:
X_train_lemma.shape: (25000, 21596)
X_train.shape: (25000, 27271)

词形还原将特征数量从 27 271 个减少到 21 596 个。词形还原可以被看作是一种正则化,因为它合并了某些特征。因此我们预计,数据集很小时词形还原对性能的提升最大。

# 仅使用1%的数据作为训练集来构建网格搜索
from sklearn.model_selection import StratifiedShuffleSplit
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10]}
cv = StratifiedShuffleSplit(n_splits=5, test_size=0.99,train_size=0.01, random_state=0)
grid = GridSearchCV(LogisticRegression(), param_grid, cv=cv)
# 利用标准的CountVectorizer进行网格搜索
grid.fit(X_train, y_train)
print("Best cross-validation score ""(standard CountVectorizer): {:.3f}".format(grid.best_score_))
# 利用词形还原进行网格搜索
grid.fit(X_train_lemma, y_train)
print("Best cross-validation score ""(lemmatization): {:.3f}".format(grid.best_score_))
运行结果:
Best cross-validation score (standard CountVectorizer): 0.721
Best cross-validation score (lemmatization): 0.731

词形还原对性能有较小的提高。与许多特征提取技术一样,其结果因数据集的不同而不同。词形还原与词干提取有时有助于构建更好的模型(或至少是更简洁的模型),所以我们建议你,在特定任务中努力提升最后一点性能时可以尝试下这些技术。

主题建模与文档聚类

常用于文本数据的一种特殊技术是主题建模(topic modeling),这是描述将每个文档分配给一个或多个主题的任务(通常是无监督的)的概括性术语。这方面一个很好的例子是新闻数据,它们可以被分为“政治”“体育”“金融”等主题。如果为每个文档分配一个主题,那么这是一个文档聚类任务,通常来说,人们在谈论主题建模时,他们指的是一种叫作隐含狄利克雷分布(Latent Dirichlet Allocation,LDA)的特定分解方法。
LDA 模型试图找出频繁共同出现的单词群组(即主题)。LDA 还要求,每个文档可以被理解为主题子集的“混合”。
在没有标签的情况下,像 LDA 这样的主题模型是理解大型文本语料库的有趣方法。不过 LDA 算法是随机的,改变 random_state参数可能会得到完全不同的结果。虽然找到主题可能很有用,但对于从无监督模型中得出的任何结论都应该持保留态度,我们建议通过查看特定主题中的文档来验证你的直觉。LDA.transform 方法生成的主题有时也可以用于监督学习的紧凑表示。当训练样例很少时,
这一方法特别有用。

小结与展望

本章讨论了处理文本 [ 也叫自然语言处理(NLP)] 的基础知识,还给出了一个对电影评论
进行分类的示例应用。如果你想要尝试处理文本数据,那么这里讨论的工具应该是很好的
出发点。特别是对于文本分类任务,比如检测垃圾邮件和欺诈或者情感分析,词袋模型提
供了一种简单而又强大的解决方案。正如机器学习中常见的情况,数据表示是 NLP 应用的
关键,检查所提取的词例和 n 元分词有助于深入理解建模过程。在文本处理应用中,对于
监督任务与无监督任务而言,通常都可以用有意义的方式对模型进行内省,正如我们在本
章所见。

Python机器学习基础教程10相关推荐

  1. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  2. python基础教程免费下载-《Python机器学习基础教程》高清版免费PDF下载

    Python机器学习基础教程-[德] 安德里亚斯·穆勒(Andreas C.Müller)[美]莎拉·吉多(Sarah Guido) 著,张亮(hysic) 译 下载地址1:网盘下载 下载地址2:网盘 ...

  3. 回归素材(part4)--python机器学习基础教程

    学习笔记,仅供参考 文章目录 python机器学习基础教程 线性模型 用于回归的线性模型 过拟合 岭回归 lasso python机器学习基础教程 线性模型 用于回归的线性模型 过拟合

  4. 泛化,过拟合,欠拟合素材(part1)--python机器学习基础教程

    学习笔记,仅供参考,有错必纠 文章目录 python机器学习基础教程 泛化.过拟合.欠拟合 模型复杂度与训练集大小的关系 python机器学习基础教程 泛化.过拟合.欠拟合 判断一个算法在新数据上表现 ...

  5. Python机器学习基础教程(1)Irises(鸢尾花)分类之新手上路

    一.感谢博客的内容提供的参考 标题:最新版学习笔记---Python机器学习基础教程(1)Irises(鸢尾花)分类---附完整代码 作者:非鱼子焉 地址:https://zhu-rui.blog.c ...

  6. python机器学习基础教程-学习笔记(一)

    了解 scikit-learn 及其用法是很重要的,但还有其他一些库也可以改善你的编程体验. scikit-learn 是基于 NumPy 和 SciPy 科学计算库的.此外,我们还会用到 panda ...

  7. Python机器学习基础教程——鸢尾花分类

    Python机器学习基础教程--鸢尾花分类 初识数据 训练数据与测试数据 观察数据-数据可视化 模型的建立与评估--K近邻算法 她还有一些鸢尾花的测量数据,这些花之前已经被植物学专家鉴定为属于 set ...

  8. 最新版学习笔记---Python机器学习基础教程(1)Irises(鸢尾花)分类---附完整代码

    开始学习机器学习基础,在此留下学习心得与自己的理解. 啥也不说,先看一下鸢尾花啥样 好看吧~~~~ Iris 1.环境搭建 2.了解数据 2.1读取数据 2.2查看数据 3.分离数据 4.构建模型(k ...

  9. python自学教程读书导图-python机器学习基础教程读书笔记八(全书总结)

    全书总结 现在你知道了如何使用重要的机器学习算法进行监督学习和无监督学习,这让你可以解 决很多种机器学习问题.在带你探索机器学习提供的所有可能性之前,我们希望给你一 些最后的建议.一些额外的资源,并提 ...

最新文章

  1. 早餐组合(购买方案)
  2. C# ManualResetEvent
  3. 10次迭代9次delay??拒绝项目延期,这里有一整套方法!
  4. LiveVideoStackCon深圳-透过业务看QoE
  5. 什么是m叉树_国考临近考试了,感觉已经没有进步空间了,最后关头还有没有什么提成成绩的好方法?...
  6. R语言第八讲 评估模型之交叉验证法分析案例
  7. matlab电机建模,Matlab系列之无刷电机matlab建模.ppt
  8. 解析搜狗等输入法右下角图标显示中英问题
  9. iOS扫码识别之后添加震动/播放声音提示、歌词解析并随音乐滚动显示(包含demo源码)
  10. Cordova Android 问题
  11. 【学术相关】交大博士学长:研究生计算机专业的方向选择!
  12. visitor 模式
  13. [附源码]Python计算机毕业设计个人人际关系管理软件Django(程序+LW)
  14. 小米 admob广告 ID_定了!小米5G新品发布会定在9月24日,4大新品值得期待
  15. SpringBoot 时间格式化
  16. 0716 POJ1222 EXTENDED LIGHTS OUT
  17. 统一自己的mac和linux环境的终端使用(alacritty+tmux代替iterm2)
  18. expect使用总结
  19. FreeRapid v0.9u3
  20. Arduino基础学习——meArm(太极创客第二部分)

热门文章

  1. 泛微E9后端学习笔记 - IDEA远程调试
  2. 熟知代码review那些事
  3. 第7课_Python条件语句的判断
  4. 教你正确分辨优劣的网线和电话线【*xpghost*】
  5. Oracle推进SCN系列:使用oradebug在mount状态下推进SCN
  6. V380修改固件和去除串口密码
  7. TextField 输入身份证号手机号银行卡号格式化解决方案
  8. bugku-Misc-wp
  9. 红旗linux无线网卡驱动,红旗Linux下配置无线网卡(驱动安装/wep sid设置)[图文]
  10. GRNN和PNN神经网络简介与MATLAB实践