使用 Python 进行机器学习
1.机器学习及训练/测试法
(1)非监督式学习
非监督学习:事先没有告诉机器学习算法某个特定的物体属于哪个类别,也没有一个将一些物体进行了正确分类的可供学习的说明书。机器学习算法必须自己推断出这些分类。
如果你不清楚想要的结果,那么这就是一种强大的工具,可以
发现未知的分类。我们称其为隐变量。有些你原来根本不清楚的数据性质,可以通过非监督式学习呈现出来。
(2)监督式学习
监督式学习:为模型提供一组训练数据进行学习,模型从中推断出特性和分类之间的联系,然后将这些联系应用到未知的值上面,并预测新信息。
1)监督式学习的评价
那么如何评价监督式学习呢?监督式学习的优点是可以使用一个称为训练/测试的巧妙方法。做法是将模型需要学习的观测数据分为两组:训练集和测试集。当基于数据训练/建立模型时,只使用训练集数据,而将另一部分数据保留起来,用于测试的目的。
2)k 折交叉验证
它的基本理念就是进行多次训练/测试,不是将数据分为一个训练集和一个测试集,而是随机分成 k 个部分。这就是 k 的由来。每次保留一个部分作为测试集,使用其他部分作为训练集去训练模型,并在测试集上度量模型性能。随后,将每个训练集模型的结果进行平均,并对每个模型的 r 方值进行平均。
2.使用训练/测试法防止多项式回归中的过拟合
可以看出,其余 20 个测试集数据同样与原始数据具有大致相同的形状。所以我们认为它是个有代表性的测试集。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2)
pageSpeeds=np.random.normal(3.0,1.0,1000)
purchaseAmount=np.random.normal(50.0,30.0,1000)/pageSpeeds
trainX=pageSpeeds[:80] #80%的数据点用于训练
testX=pageSpeeds[80:] #20%的数据点用于测试
trainY=purchaseAmount[:80]
testY=purchaseAmount[80:]
plt.scatter(trainX,trainY)
plt.show()
plt.scatter(testX,testY)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
np.random.seed(4)
pageSpeeds=np.random.normal(3.0,1.0,100)
purchaseAmount=np.random.normal(50.0,30.0,100)/pageSpeeds
trainX=pageSpeeds[:80] #80%的数据点用于训练
testX=pageSpeeds[80:] #20%的数据点用于测试
trainY=purchaseAmount[:80]
testY=purchaseAmount[80:]
axes=plt.axes()
axes.set_xlim([0,7])
axes.set_ylim([0,200])
x=np.array(trainX)
y=np.array(trainY)
xp=np.linspace(0,8,100)
p8=np.poly1d(np.polyfit(x,y,8))
r2=r2_score(y,p8(x))
print(r2)
plt.plot(xp,p8(xp),'r')
plt.scatter(x,y)
plt.show()
#0.26799551038851466
x=np.array(testX)
y=np.array(testY)
xp=np.linspace(0,8,100)
p8=np.poly1d(np.polyfit(x,y,8))
r2=r2_score(y,p8(x))
print(r2)
plt.plot(xp,p8(xp),'r')
plt.scatter(x,y)
plt.show()
#0.564886773838656
3.贝叶斯方法——概念
如何在机器学习中应用贝叶斯定理?可以用这个定理建立一个垃圾邮件分类器:它是一种算法,可以分析已知的垃圾邮件和非垃圾邮件,并训练一个模型来预测新的电子邮件是否为垃圾邮件。现实世界中的垃圾邮件分类器确实使用了这种技术。作为一个例子,让我们来确定一封含有“free”这个词的电子邮件是否为垃圾邮件。如果有人向你推销免费的东西,那它很可能是垃圾邮件!下面来研究一下这个问题。在含有“free”这个词的情况下,一封邮件是垃圾邮件的概率等于它是垃圾邮件的总体概率乘以垃圾邮件中含有“free”的概率再除以所有邮件中含有“free”的总体概率。
scikit-learn 提供了一个称为 CountVectorizer 的功能,可以非常简单地对电子邮件进行分词,并对每个单词进行处理。scikit-learn 还有一个 MultinomialNB 函数,其中的 NB 就表示朴素贝叶斯,这个函数可以为我们完成朴素贝叶斯中的所有繁重工作。
4.三种朴素贝叶斯模型
朴素:独立性假设,假设各个特征之间是独立不相互的
(1)高斯分布朴素贝叶斯
用途:用于一般分类问题
import numpy as np
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB # 高斯贝叶斯
g_NB = GaussianNB()
lris_df = datasets.load_iris()
index = np.arange(0, 150)
np.random.shuffle(index) # shuffle表示将数据随机打乱
X_train = lris_df.data[index[:-10]]
X_test = lris_df.data[index[-10:]]
Y_train = lris_df.target[index[:-10]]
Y_test = lris_df.target[index[-10:]]
m = g_NB.fit(X_train, Y_train)
acc_score = m.score(X_test, Y_test)
print(acc_score) #0.9
(2)多项式分布朴素贝叶斯
用途:适用于文本数据(特征表示的是次数,例如某个词语出现的次数)
from sklearn.naive_bayes import MultinomialNB
from sklearn import datasets
import numpy as np
m_NB=MultinomialNB() #多项式朴素贝叶斯
lris_df = datasets.load_iris()
index = np.arange(0, 150)
np.random.shuffle(index) # shuffle表示将数据随机打乱
X_train = lris_df.data[index[:-10]]
X_test = lris_df.data[index[-10:]]
Y_train = lris_df.target[index[:-10]]
Y_test = lris_df.target[index[-10:]]
m=m_NB.fit(X_train,Y_train).score(X_test,Y_test)
print(m) #0.9
(3)伯努利分布朴素贝叶斯
用途:适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语出现为1,不出现为0),绝大多数情况下表现不如多项式分布,但有时候伯努利分布要比多项式分布好,尤其是对于小数量级的文本数据)
from sklearn.naive_bayes import BernoulliNB
from sklearn import datasets
import numpy as np
b_NB=BernoulliNB() #多项式朴素贝叶斯
lris_df = datasets.load_iris()
index = np.arange(0, 150)
np.random.shuffle(index) # shuffle表示将数据随机打乱
X_train = lris_df.data[index[:-10]]
X_test = lris_df.data[index[-10:]]
Y_train = lris_df.target[index[:-10]]
Y_test = lris_df.target[index[-10:]]
m=b_NB.fit(X_train,Y_train).score(X_test,Y_test)
print(m) #0.1
实例:短信垃圾分类
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer # 用于转换字符串
from sklearn.naive_bayes import MultinomialNB
m_NB = MultinomialNB()
sms = pd.read_table('F:/demo.txt')
X=sms.values[0]
tf=TfidfVectorizer()
X_train=tf.fit_transform(X)
m=m_NB.fit(X_train,sms.values[1])
y=sms.values[2]
tf.fit(X)
y=tf.transform(y)
Y_train=tf.fit_transform(y)
n=m_NB.predict(Y_train)
print(n)