1.转换器和预估器
2.KNN算法
定义:如果一个样本在特征空间总的K个最相近的特征空间中最邻近的样本中的大多数属于某一个类别,则该样本也属于这个类别
核心思想:你的“邻居”来推断你的类别
计算距离:
欧式距离
曼哈顿距离
明可夫斯基距离
快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。
brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。
kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。
ball tree是为了克服kd树高纬失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。
优点:简单,易于实现,无需训练
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大;必须指定K值,K值选择不当则分类精度不能保证
使用场景:小数据场景,几千~几万样本
由于——
K值过大,容易受到样本不均衡的影响
K值过小,容易受到异常值影响
我们需要找到适合的k值用模型选择与调优
2.1模型选择与调优
2.1.1交叉验证
2.1.2网格搜索(超参数搜索)
通常情况下,很多参数是需要手动指定的(如K-近邻算法中的K值),这种叫超参数。
但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型(就是机器帮我们全部一个一个算,不用自己试了)
代码:
#K-近邻算法的训练
from sklearn.datasets import load_iris # 获取数据集
from sklearn.model_selection import train_test_split # 划分数据集
from sklearn.preprocessing import StandardScaler # 标准化
from sklearn.neighbors import KNeighborsClassifier # KNN算法分类
from sklearn.model_selection import GridSearchCV
#1.获取数据
iris = load_iris()
# 2、划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
# 3、特征工程:标准化
'''
要用通过训练集得到的模型来验证测试集 所以要保证形成模型前训练集和测试集的操作都是一样的
'''
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) # 训练集标准化
x_test = transfer.transform(x_test) # 测试集标准化 不用fit,继续用训练集得到的平均值和标准差(也是操作一致)
# 4、KNN算法预估器
'''
计算距离已经被写好了在KNeighborsClassifier里
'''
estimator = KNeighborsClassifier()
# 加入网格搜索与交叉验证
# 参数准备
param_dict = {"n_neighbors": [1,3,5,7,9,11]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10) # 10折,数据量不大,可以多折
estimator.fit(x_train, y_train)#调用完fit后就是得到了模型
# 5、模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict) # 直接比对
# 方法2:计算准确率
score = estimator.score(x_test, y_test) # 测试集的特征值,测试集的目标值
print("准确率:\n", score)
# 查看最佳参数:best_params_
print("最佳参数:", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果:", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:", estimator.cv_results_)
3.朴素贝叶斯算法
核心思想:谁概率大(占比大)选谁
贝叶斯公式:
若公式应用到文章分类的场景中为:
改善:拉普拉斯平滑系数
API: sklearn.naive_bayes.MultinomialNB(alpha=1.0) alpha是拉普拉斯平滑系数
优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类
- 分类准确度高,速度快
缺点:
由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好
代码:
#用朴素贝叶斯算法对新闻进行分类
'''
1 步骤分析
1)获取数据
2)划分数据集
3)特征工程:文本特征抽取_tfidf()
4)朴素贝叶斯预估器流程
5)模型评估
'''
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split # 划分数据集
from sklearn.feature_extraction.text import TfidfVectorizer # 文本特征抽取
from sklearn.naive_bayes import MultinomialNB # 朴素贝叶斯
# 1)获取数据 subset='all'为训练集
news = fetch_20newsgroups(subset='all')
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
# 3)特征工程:文本特征抽取
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)朴素贝叶斯算法预估器流程
#调包,所有计算算法都在包里面
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5)模型评估
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接必读真实值和预测值:\n", y_test == y_predict) # 直接比对
# 方法2:计算准确率
score = estimator.score(x_test, y_test) # 测试集的特征值,测试集的目标值
print("准确率:", score)
4.决策树
核心思想:用特征的先后顺序进行高效的决策
香农说:信息是能够用来消除不确定性的东西
信息熵:把信息量化,指消除不定性的 这些东西有多少
信息增益:决策树划分依据之一
知道一个特征X它使类Y的信息的不确定性减少的程度 (越强那肯定放前面来决策)
例题理解:
API:
sklearn.tree.DecisionTreeClassifier(criterion='gini', max_depth=None, random_state=None)
决策树分类器
criterion:默认是“gini”系数,也可以选择信息增益的熵‘entropy’
max_depth:树的深度大小
random_state:随机数种子
优点:简单的理解和解释,树木可视化
缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合
改进:剪枝cart算法(决策树API当中已经实现)、随机森林
在决策过程应用较多,可以清晰的显示哪些字段比较重要(这一特性可以用于特征选择)
代码:
'''
信息熵:把信息量化,指消除不定性的东西有多少
决策树算法
'''
from sklearn.datasets import load_iris # 获取数据集
from sklearn.model_selection import train_test_split # 划分数据集
from sklearn.tree import DecisionTreeClassifier #决策树
from sklearn.tree import export_graphviz #可视化
#可视化第二种
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
%matplotlib inline
# 1)获取数据集
iris = load_iris()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22) # 随机数种子
# 不用做特征工程:标准化
# 3)决策树预估器
estimator = DecisionTreeClassifier(criterion='entropy')
estimator.fit(x_train, y_train)
# 方法2:计算准确率
score = estimator.score(x_test, y_test) # 测试集的特征值,测试集的目标值
print("准确率:", score)
# 可视化决策树
#第一种把iris_tree.dot内容放到http://webgraphviz.com/网站
export_graphviz(estimator, out_file='iris_tree.dot', feature_names=iris.feature_names)
#第二种
plot_tree(decision_tree=estimator)
plt.show()
5.随机森林
集成学习方法:
通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各种独立地学习和做出预测。这些预测最后结合成组合预测,因此优于任何一个单分类做出的预测
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别数输出的类别的众数而定
例如,如果训练了5棵树,5棵树的结果是True ,1棵树的结果是False,那么最终结果为True
随机——训练集随机、特征随机;森林——建立多棵树
API:
n_estimator,max_depth 可以用网格搜索
总结;
在当前所有算法中,具有极好的准确率
能够有效地运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维
能够评估各个特征在分类问题上的重要性
代码:
'''随机森林
'''
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
estimator = RandomForestClassifier()
# 加入网格搜索与交叉验证
# 参数准备
param_dict = {"n_estimators":[120,200,300,500,800,1200], "max_depth":[5,8,15,25,30]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3) # 10折,数据量不大,可以多折
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接必读真实值和预测值:\n", y_test == y_predict) # 直接比对
# 方法2:计算准确率
score = estimator.score(x_test, y_test) # 测试集的特征值,测试集的目标值
print("准确率:", score)
# 查看最佳参数:best_params_
print("最佳参数:", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果:", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:", estimator.cv_results_)
总结
我是跟着黑马学的,这里是黑马的文章连接:相关代码也在下面黑马程序员---三天快速入门Python机器学习(第二天)_zdb呀的博客-CSDN博客