'''
目标值:类别
1.sklearn转换器和预估器
2.KNN算法 -- 少量数据
3.模型选择与调优 --
4.朴素贝叶斯算法 -- 避免0的情况 使用拉普拉斯平滑系数
5.决策树
6.随机森林
3.1 转换器和预估器
转换器
估计器(estimator)
3.1.1 转换器
1.实例化 一个转换器类
2.调用fit_transform
标准化:
(x-mean)/std
-fit: 计算每一列的平均值 标准差
-transform: 进行最终的转换
3.1.2 估计器(sklearn机器学习算法的实现)
基本所有算法都继承于估计器
1.实例化一个estimator类
2.estimator.fit(x_train,y_train)计算
-调用完毕,模型生成
3 模型评估
- 1.直接比对真实值和预测值
y_predict = estimator.predict(x_test)
y_test == y_predict
- 2.计算准确率
accuracy = estimator.score(x_test,y_test)
3.2 k-近邻算法(KNN算法)
3.2.1 什么是kn算法
KNN
2.1.1核心思想:
根据你的邻居来给你判断你的类别
举个例子:
如果我在一个地方,我想知道我在哪个区,
但是现在我只知道地图上的一些样本所在区,那么我就取离我最近的一个人的区
定义:
如果一个样本在特征空间当中k个最相似的样本大多数属于某一个类别,则该样本也属于这个类别
- k = 1:容易受到异常点的影响
计算距离:
距离公式
-欧氏距离
a(a1,a2,a3) b(b1,b2,b3)
sqrt((a1-b1)^2+...)
-曼哈顿距离(绝对值距离)
不平方,用绝对值
-明可夫斯基距离
欧氏距离和曼哈顿距离是明可夫斯基距离的推广
2.1.2 电影类型分析
k值过大,样本不均衡时会容易分错
k值过小,容易受到异常点影响
- 在使用算法之前,使用k-近邻算法
需要无量纲化
- 标准化(归一化容易受到异常值的影响)
2.1.3 使用
两个参数 n_neighbors = 5:k
algorithm = 'auto':使用算法
2.1.4 案例1:鸢尾花种类预测
1.获取数据
2.数据集划分(训练集、测试集)
3.特征工程
- 标准化
- 降维(这里不需要因为只有四个特征,并且该数据集整理得很好)
2.1.5 KNN总结
优点:简单
缺点:
1.对k的取值不确定
2.需要跟任何一个点进行计算,效率比较低,所以不合适用于数据量比较大的算法
2.1.6 模型选择与调优
1.什么是交叉验证(cv)
将拿到的训练数据,再分为训练和验证集。
例如,将数据分为四份,其中一份作为验证集
然后经过4次的测试,每次更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证
训练集:训练集+验证集
测试集:测试集
使得训练得出的模型更加准确可信
2.超参数搜索、网格搜索
通常情况下,有很多参数是需要手动指定的(如kNN中的k值)
2.1.7 facebook案例--使用jupyter
3.3 朴素贝叶斯算法
3.3.1 什么是朴素贝叶斯分类方法
朴素:假设特征与特征之间是相互独立的
朴素 + 贝叶斯
应用场景:
文本分类
单词作为特征
假设词与词之间相互独立
3.3.2 贝叶斯公式
P(A|B) = P(AB)/P(B)
P(B|A) = P(A|B)*P(B)/P(A)
3.3.3 拉普拉斯平滑系数
P(F1|C) = (Ni + a)/(N + am)
a为指定的系数一般为1,m为特征词的个数
避免出现概率为0的情况
3.3.4 总结
优点:
分类准确值高 对缺失值不敏感
缺点:
假定特征和特征之间相互独立
3.4决策树
3.4.1 认识决策树
如何高效的进行决策
1.根据特征的先后顺序
3.4.2 决策树原理
eg:银行贷款数据
已知四个特征 预测 是否给贷款
-找到一种数学的方法快速判断先看哪种特征
信息论基础 -- 决策树划分依据 先划分哪一个说明哪个信息增益越多
1.信息
香农:信息是消除随机不定性的东西
小明 年龄 “今年18岁”
小华:“小明明年19岁”--已经不是信息了,因为已知小明年龄所以该话没有消除随即不确定性
2.信息的衡量(信息消除不确定性的大小)
-信息量 - 信息熵(H)(其实就是求期望)
-信息增益:g(D,A) = H(D) - H(D|A)
总的信息熵减去知道某一特征之后的条件熵
表示得知某特征之后不确定性减少的成都使得类Y的信息熵减少的程度
3.4.3 决策树划分 --信息增益
没有免费的午餐
决策树更适合用在数据量比较大的数据
KNN更适合用在数据量比较小的数据
3.4.4 决策树可视化 -- 可以进行可视化
3.4.5 决策树总结
优点:
可视化 -- 可解释能力强
缺点
不能很好的推广至过于复杂的树,否则树的深度会很深,容易产生过拟合(对训练集拟合效果很好)
改进:
1.剪枝cart算法
2.随机森林
3.5 泰坦尼克号
流程分析:特征值、目标值
1.获取数据
2.数据处理
缺失值处理
特征当中有很多类别最好转化为one-hot编码
所以最好转化为字典类型 方便处理
3.划分数据集
4.特征工程:字典特征抽取
5.决策树预估器(决策树不需要标准化)
6.模型评估
3.6 集成学习方法 随机森林
3.6.1 什么是集成学习方法
通过建立几个模型组合的来解决单一预测问题,多个模型取众数
3.6.2 什么是随机森林
随机
森林:包含多个决策树的分类器
3.6.3 随机森林原理
训练集:特征值 目标值
随机
两个随机
训练集随机
bootstrap 随机有放回抽样
[1,2,3,4,5]
新的树的训练集
特征随机
从M个特征中随机m个特征 M>>m
降维 可以提高时间效率
笨的树会相互抵消,聪明的树会脱颖而出
具有极好的准确率
适合高维特征、大数据
'''
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
def decision_iris():
'''
用决策树对鸢尾花进行分类
1.获取数据集
2.划分数据集
3.决策树预估器
4.模型评估
'''
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
estimator = DecisionTreeClassifier(criterion='entropy')
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test == y_predict)
score = estimator.score(x_test,y_test)
print("准确率:\n",score)
export_graphviz(estimator,out_file="iris_tree.dot",feature_names=iris.feature_names)
return None
if __name__ == '__main__':
print()
decision_iris()
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_iris():
"""
用knn算法对鸢尾花进行分类
1.获取数据
2.划分数据集
3.特征工程:标准化
4.knn算法预估器
5.模型评估
"""
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=8)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
estimator = KNeighborsClassifier(n_neighbors=4)
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test == y_predict)
score = estimator.score(x_test,y_test)
print("准确率:\n",score)
return None
from sklearn.model_selection import GridSearchCV
def knn_iris_gscv():
"""
用knn算法对鸢尾花进行分类
添加网格搜索和交叉验证
1.获取数据
2.划分数据集
3.特征工程:标准化
4.knn算法预估器
5.模型评估
"""
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=8)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
estimator = KNeighborsClassifier()
param_dict = {"n_neighbors":[1,3,5,7,9]}
estimator = GridSearchCV(estimator,param_grid=param_dict,cv = 10)
estimator.fit(x_train,y_train)
print("最佳参数:\n",estimator.best_params_)
print("最佳结果:\n",estimator.best_score_)
print("最佳估计器:\n",estimator.best_estimator_)
print("交叉验证结果:\n",estimator.cv_results_)
y_predict = estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test == y_predict)
score = estimator.score(x_test,y_test)
print("准确率:\n",score)
return None
if __name__ == '__main__':
print()
knn_iris_gscv()
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
"""
1.获取数据
2.划分数据集
3.特征工程
文本特征提取
4.朴素贝叶斯算法预估器流程
5.模型评估
"""
def nb_news():
"""
用朴素贝叶斯算法对新闻进行分类
"""
news = fetch_20newsgroups(subset="all")
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,random_state=8)
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
estimator = MultinomialNB()
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test == y_predict)
score = estimator.score(x_test,y_test)
print("准确率:\n",score)
return None
if __name__ == '__main__':
nb_news()