机器学习入门(2)

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博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值