机器学习(入门2)
3 分类算法
3.1 sklearn转换器和预估器(预备知识)
3.1.1 转换器
1)实例化
2)调用fit_transform fit():计算每一列的均值方差 transform:std进行最终转换
3.1.2 预估器estimator(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 KNN算法:[由邻居判断类别]
3.2.1定义:样本特征空间中k个量相似(即特征空间中最邻近)的样本中大多数属于某一个类别,则此样本属于此类别。
确定邻居:计算距离(常用欧氏距离,曼哈顿距离,明可夫斯基距离)
【注:k值过大,受样本不均衡影响;k值过小,容易受异常点影响】
3.2.2 KNN算法API:sklearn.neghbors.KNeighborsClassifier(n_neighbors=5,algorithm=’auto’)
n_neighbors: k值
Algorithm:{tree,auto,kd_tree…}
3.2.3 KNN特点:简单易于实现,无需训练,必须指定K值,K值选取很关键,内存开销大,小样本数据:几千~几万样本
代码示例:
KNN算法对鸢尾花分类
1 获取数据
2 数据集划分 训练和测试集
3 特征工程,标准化
4 KNN预估器流程
5 模型评估
'''
from sklearn.datasets import load_iris,fetch_20newsgroups
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier,export_graphviz
def KNN_demo():
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
transfor=StandardScaler()
# 训练集标准化
x_train = transfor.fit_transform(x_train)
# 测试集做和训练集一样操作,仅transform
x_test = transfor.transform(x_test)
# KNN预估器流程
# 实例化
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
print("比对真实值:\n",y_predict==y_test)
score = estimator.score(x_test,y_test)
print("准确率:\n",score)
return None
3.3 模型选择与调优
3.3.1 交叉验证(CA):将训练数据分为训练和验证集
3.3.2 超参数搜索-网格搜索(GS)
作用:一般,很多参数需要手动指定(如:KNN算法的K值),这种称谓超参数,所以对模型预设几种超参数组合,每组都采用交叉验证,最后得到最优参数组合建立模型
API:sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=NONE)
Estimator:预估器对象
param_grid:估计其参数,字典形式 {“n_neighbors”:[1,3,5]}
Cv:指定几折交叉验证
Fit():输入训练数据
Score():准确率
结果:最佳参数:best_params_ ; 最佳结果:best_score_ ;
最佳估计器:best_estimator_ ; 交叉验证结果:cv_results_
代码示例:
def KNN_iris_GSCV():
# KNN算法加上网格搜索和交叉验证
iris = load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=6)
transfor=StandardScaler()
# 训练集标准化
x_train = transfor.fit_transform(x_train)
# 测试集做和训练集一样操作,仅transform
x_test = transfor.transform(x_test)
# KNN预估器流程
# 实例化
estimator = KNeighborsClassifier()
# 网格搜索和交叉验证
params_GS = {"n_neighbors":[1,3,5,7,9,11]}
estimator = GridSearchCV(estimator,params_GS,cv=10)
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
print("比对真实值:\n",y_predict==y_test)
score = estimator.score(x_test,y_test)
print("准确率:\n",score)
print("最佳参数:\n",estimator.best_params_)
print("最佳结果:\n",estimator.best_score_)
print("最佳估计器:\n",estimator.best_estimator_)
print("交叉验证结果:\n",estimator.cv_results_)
return None
3.4 朴素贝叶斯算法(概率)朴素:默认特征与特征相互独立 + 贝叶斯公式
3.4.1 概率:联合概率 P(A,B);条件概率P(A|B) ; 相互独立P(A,B)=P(A)P(B)
公式:
应用:文本分类,情感分析,避免出现概率值为0,采用拉普拉斯平滑系数
拉普拉斯平滑系数: a为指定系数=1,m为训练中特征词个数
3.4.2 API:Sklearn.naive_bayes.MultinorialNB(alpha=1.0)
3.4.3 特点:对缺失数据不敏感,简单分类准确度高,速度快,特征属性相关时效果不好。
代码示例:
def nb_news():
# 朴素贝叶斯分类
# 获取数据
news = fetch_20newsgroups(data_home="/classfy_alg",subset="all")
# 划分数据及
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target)
# 特征提取 文本特征提取
transfor = TfidfVectorizer()
x_train = transfor.fit_transform(x_train)
x_test = transfor.transform(x_test)
# NB算法预估器
estimator = MultinomialNB()
estimator.fit(x_train,y_train,)
# 评估
y_predict = estimator.predict(x_test)
print("比对真实值:\n", y_predict == y_test)
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
return None
3.5 决策树:if—else :高效的决策顺序–特征先后顺序 ,划分:信息增益值越大越优先。
3.5.1 原理:信息熵,信息增益
信息熵
信息增益 g(D,A) = H(D) - 条件熵H(D|A)
3.5.2 API:
sklearn.tree.DecisionTreeClassfier(criyerion=’gini’,max_depth=None,random_state=None
criyerion默认’gini’,也可用信息增益:‘entropy’
max_depth:深度大小
random_state:随机数种子
3.5.3 决策树可视化
保存树的结构到dot文件
API:Sklearn.tree.export_graphviz() //能导出DOT格式
Tree.export_graphviz(estimator,out_file=’tree.dot’,feature_names=[“,”])
转化为树形:网站 :webgraphviz.com
特点:简单,可视化,数据庞大容易过拟合,改进:剪枝cart算法;随机森林。
代码示例:
def tree_desicion_demo():
# 决策树对鸢尾花分类,不用做标准化
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("2 比对真实值:\n", y_predict == y_test)
score = estimator.score(x_test, y_test)
print("2 准确率:\n", score)
# 可视化决策树
export_graphviz(estimator,out_file="tree.dot",feature_names=iris.feature_names)
return None
3.6 随机森林:包含多个决策树的分类器,由众数决定
3.6.1 原理:随机:特征值随机:从M个特征中随机抽取m个特征 ,M>>m(降维)
训练集随机:bootstrap 随机有放回抽样
森林:多个决策树
3.6.2 API:
sklearn.ensemble.RandomForestClassifter(n_estimator=10,criterion=’gini’,max_depth=None,bootstrap=True,random_state=None,min_sample_split=2)
criterion=’gini’:划分方法
n_estimator=10:森林数目数量
Max_feature: 每个决策树的最大特征数量即m,属性:auto,sqirt,…
min_sample_split:结点划分最少样本数
min_sample_leaf:叶子结点最小样本数
超参数:n_estimator,max_depth, min_simples_split, min_sample_leaf
特点:在所有算法中,有较好的准确率,有效运行在大数据集,处理高维数据不必降维。
'''
决策树泰坦尼克号预测幸存
# 1 获取数据
2 数据处理
缺失值处理
特征值-->字典类型
3 准备好特征值目标值
4 划分数据集
5 特征工程 字典特征提取
6 决策树预估器流程
'''
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
def tree_tantan():
path = "https://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
titanic = pd.read_csv(path)
# 筛选特征值和目标值
x = titanic[["pclass","age","sex"]]
y = titanic["survived"]
# 缺失值处理 填补平均值mean
x["age"].fillna(x["age"].mean(),inplace=True)
# 特征值 -->字典类型
x = x.to_dict(orient="record")
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22)
#tezhengchouqu
transfor = DictVectorizer()
x_train=transfor.fit_transform(x_train)
x_test = transfor.transform(x_test)
estimator = DecisionTreeClassifier(criterion="entropy",max_depth=8)
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)
print("2 比对真实值:\n", y_predict == y_test)
score = estimator.score(x_test, y_test)
print("2 准确率:\n", score)
export_graphviz(estimator, out_file="titanic_tree.dot", feature_names=transfor.get_feature_names())
# 随机森林对泰坦尼克预测
estimator = RandomForestClassifier()
params_GS = {"n_estimateor": [120, 200, 300, 500, 800, 1200],"max_depth":[5,8,10,15]}
estimator = GridSearchCV(estimator, params_GS, cv=2)
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)
print("比对真实值:\n", y_predict == y_test)
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
print("最佳参数:\n", estimator.best_params_)
print("最佳结果:\n", estimator.best_score_)
print("最佳估计器:\n", estimator.best_estimator_)
print("交叉验证结果:\n", estimator.cv_results_)
return None
本文是基于B站机器学习入门学习的笔记分享,有误之处,敬请指出