机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
访问作者github: https://github.com/NefelibataBIGR/Machine_Learning_Notes ,获取笔记代码
- 深度学习 ⊆ 机器学习 ⊆ 人工智能
- 机器学习是人工智能的一个实现途径
- 深度学习是由机器学习发展而来
- 应用领域:传统预测、图像识别、自然语言处理
- 理论书:《机器学习》“西瓜书”、《统计学习方法》
- 库:sklearn
- ==模型选择==:
现在应用广泛的是集成学习算法(多个弱学习器组成强学习器): - Bagging(投票制,并行):随机森林
- Boosting(残差拟合,串行):GBDT、XGBoosting、LightGBM、CatBoosting
五、分类算法
具体代码见Python>MachineLearning文件中的==classification.py==文件
- 标签值:类别
- 二分类问题见:逻辑回归与二分类(第六节)
1、kNN算法
k-近邻算法,k-nearest neighbor classification
根据k个“邻居”推断自身类别
k个最相似(特征空间上最邻近)的样本大多属于一个类别,则推断所求样本类别也是这个类别
k值:
- 过小:容易受异常值影响
- 过大:容易受样本不均衡影响
计算距离:
- 欧几里得(欧式)距离:平方差求和开根
- 曼哈顿距离:差绝对值求和
- 闵可夫斯基距离:对欧式距离和曼哈顿距离公式的概括性的表述
==必须先做标准化再kNN,避免量级的支配影响!!!==
优点:简单易实现
缺点:
- k值选择不当影响精度
- 计算量大,内存消耗大
应用场景:小数据场景(几千~几万样本)
API:
- sklearn.neighbors.KNeighborsClassifier(n_neighbors= )
- 参数(可省略):
- n_neighbors= :k值,默认=5
- algorithm= :可选{‘auto’ , ‘ball_tree’ , ‘kd_tree’ , ‘brute’},默认=’auto’,不同方法效率不同
- 默认用欧氏距离
- KNeighborsClassifier.fit(x_train , y_train):训练
- KNeighborsClassifier.predict(x_test):预测
- KNeighborsClassifier.score(x_test, y_test):评估
- 参数(可省略):
2、模型选择与调优
(1)交叉验证
n折交叉验证(cross-validation,CV):将训练集再分为训练集与验证集,分成n份(任意1份作为验证集,其他n-1份作为训练集),轮流进行验证,得到n个准确率,求平均作为总准确率
↑四折交叉验证优点:让模型更加准确
(2)超参数搜索
- 超参数:需要手动指定的参数(如k值)
- 网格搜索(Grid search):预设几组超参数,每组采用交叉验证的方法评估,选出最优超参数
- sklearn.model_selection.GridSearchCV(estimator , param_grid= , cv= )
参数:
- estimator:算法实例
- param_grid=:estimator的超参数选择(字典形式)
- 如:{ ‘n_neighbors’ : [1 , 3 , 5] }
- cv=:指定几折交叉检验(常用10折)
GridSearchCV.fit(x_train , y_train):训练
GridSearchCV.predict(x_test):预测
GridSearchCV.score(x_test, y_test):评估
属性:
- 最佳超参数:.best_params_
- 最佳结果:.best_score_
- 最佳预估器:.best_estimator_
- 交叉验证结果:.cv_results_
- 例:kNN预测鸢尾花类型
# 1、读取数据
iris = load_iris()
# print(iris)
# 2、划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=1)
# print(type(x_train))
# 3、特征工程:标准化
trans = StandardScaler()
x_train = trans.fit_transform(x_train) # 对x_train进行标准化
x_test = trans.transform(x_test) # 对x_test也进行相同的标准化
# 4、训练knn模型
esti = KNeighborsClassifier() # 实例化一个预估器
para_grid = {'n_neighbors': [1, 3, 5, 7, 9, 11]}
esti = GridSearchCV(esti, param_grid=para_grid, cv=10) # 网格搜索+交叉验证
esti.fit(x_train, y_train) # 训练
# 5、评估模型
# 方法1:
y_pred = esti.predict(x_test) # 预测
print("y_predict =", y_pred)
print("accuracy_1 =", np.sum(y_pred == y_test)/sum(np.ones(y_test.shape))) # 计算准确率
# 方法2:
accuracy = esti.score(x_test, y_test) # 计算准确率
print("accuracy_2 =", accuracy)
# 最佳参数:best_params_
print("最佳参数:\n", esti.best_params_)
# 最佳结果:best_score_
print("最佳结果:\n", esti.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:\n", esti.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:\n", esti.cv_results_)
输出:
- 案例:Facebook签到位置预测
具体代码见Python>MachineLearning文件中的==facebook_knn.ipynb==文件
3、朴素贝叶斯算法
- 分类结果是概率值,需要数据量大
- 原理:朴素+贝叶斯
- 贝叶斯:联合概率、条件概率、相互独立的概念定义,贝叶斯公式
- 朴素:假设特征之间相互独立
- 拉普拉斯平滑系数:
- 防止计算出的分类概率为0
α系数一般为1,m为训练文档中统计出的特征词数(所有有意义的特征词、不重复),N为所有C条件下所有词的个数,Ni为所有C条件下F1词的个数
- 应用场景:文本分类(情感分析等)
API:
- sklearn.naive_bayes.MultinormialNB(alpha=1.0)
alpha=:拉普拉斯平滑系数(默认=1.0)
MultinormialNB.fit(x_train , y_train):训练
MultinormialNB.predict(x_test):预测
MultinormialNB.score(x_test, y_test):评估
代码示例:
news = fetch_20newsgroups(subset="all") # 获取数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, random_state=11) # 划分数据集
# 特征工程:文本特征抽取(Tf-idf)
trans = TfidfVectorizer()
x_train = trans.fit_transform(x_train)
x_test = trans.transform(x_test)
print("type of x_test:", type(x_test))
# 朴素贝叶斯算法
esti = MultinomialNB()
esti.fit(x_train, y_train)
# 模型评估
# 方法1:
y_pred = esti.predict(x_test) # 预测
print("y_predict =", y_pred)
accuracy_1 = np.sum(y_pred == y_test)/sum(np.ones(y_test.shape))
print("accuracy_1 =", accuracy_1) # 计算准确率
# 方法2:
accuracy_2 = esti.score(x_test, y_test) # 计算准确率
print("accuracy_2 =", accuracy_2)
输出:
- 优点:
- 稳定的分类效率
- 对缺失值不太敏感,算法简单
- 速度快
- 缺点:
- 由于假设特征之间相互独立,所以当特征关联性强的时候效果差
4、决策树
按照类似if…else…的结构分割数据,按顺序高效决策
需要决定按照特征的先后顺序
信息论基础:
- 信息熵
- 信息增益:g(D , A) = 总信息熵 H(D) - 条件熵 H(D|A)
根据不确定度减少最多的特征排序判断,也就是信息增益最大排序的特征判断
API:
sklearn.tree.DecisionTreeClassifier(criterion= , max_depth= , random_state= )
- 决策树分类器
- 参数:
- criterion=:决策树划分依据,默认’gini’,可以选信息增益’entropy’
- max_depth=:树的深度大小,默认None(拟合所有特征,可能会过拟合)
- random_state=:随机数种子
决策树的可视化:
sklearn.tree.export_graphviz(estimator , out_file=’xxx.dot’ , feature_names=[‘ ‘ , ‘ ‘])
- estimator:需要导出的训练好的预估器
- out_file=:导出文件的名字,格式为.dot
- feature_names=:导出的特征名字
可以在网站webgraphviz中打开.dot文件查看树的形状,也可以在vscode中安装插件Graphviz Interactive Preview预览
优点:可视化,可解释能力强
缺点:过于深的树容易过拟合
改进:减枝cart算法,随机森林
应用范围:企业决策
- 案例:泰坦尼克号乘客生存预测
具体代码见Python>MachineLearning文件中的==titanic.ipynb==文件
5、随机森林
- 防止决策树出现过拟合
- 集成学习算法:建立几个模型组合解决单一预测问题,最后预测的结果取几个模型预测结果的众数
- 随机森林:包含多个决策树的分类器,结果由多个决策树结果的众数决定
- 两个随机:(保持每个决策树的独立)
- 训练集随机
- BootStrap抽样:在N个样本中随机有放回抽样抽N个,组成新训练集,抽到的新训练集可能有重复样本
- 特征随机
- 在M个特征中随机有放回抽样抽m个,组成新特征集,抽到的新特征集可能有重复特征(M>>m)
- 优点:降维,运算速度快,防止过拟合,但不损失正确率
- 训练集随机
API:
sklearn.ensemble.RandomForestClassifier(参数):
- 参数:
- n_estimators:树木数量,默认为10
- criterion=:决策树划分依据,默认’gini’
- max_depth=:树的深度大小,默认None
- bootstrap=:是否随机有放回抽样,默认True
- max_features=:每个决策树的最大特征数量
- ‘auto’ 或 ‘sqrt’:m=sqrt(M)
- ‘log2’:m=log2(M)
- None:m=M(一般不用)
- random_state=:随机数种子
- …
- 参数:
优点:
- 具有极好的准确率
- 适用于大数据场景,能处理高维特征的输入样本
- 能评估每个特征在分类问题上的重要性