机器学习-分类算法
流程图
分类算法
分类算法
目标值:类别 1、sklearn转换器和预估器 2、KNN算法 3、模型选择与调优 4、朴素贝叶斯算法 5、决策树 6、随机森林
分类算法 目标值:类别 1、sklearn转换器和预估器 2、KNN算法 3、模型选择与调优 4、朴素贝叶斯算法 5、决策树 6、随机森林 3.1 sklearn转换器和估计器 转换器 估计器(estimator) 3.1.1 转换器 - 特征工程的父类 1 实例化 (实例化的是一个转换器类(Transformer)) 2 调用fit_transform(对于文档建立分类词频矩阵,不能同时调用) 标准化: (x - mean) / std fit_transform() fit() 计算 每一列的平均值、标准差 transform() (x - mean) / std进行最终的转换 3.1.2 估计器(sklearn机器学习算法的实现) 估计器(estimator) 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-近邻算法 3.2.1 什么是K-近邻算法 KNN核心思想: 你的“邻居”来推断出你的类别 1 K-近邻算法(KNN)原理 k = 1 容易受到异常点的影响 如何确定谁是邻居? 计算距离: 距离公式 欧氏距离 曼哈顿距离 绝对值距离 明可夫斯基距离 2 电影类型分析 k = 1 爱情片 k = 2 爱情片 …… k = 6 无法确定 k = 7 动作片 如果取的最近的电影数量不一样?会是什么结果? k 值取得过小,容易受到异常点的影响 k 值取得过大,样本不均衡的影响 结合前面的约会对象数据,分析K-近邻算法需要做什么样的处理 无量纲化的处理 标准化 sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto') n_neighbors:k值 3.2.3 案例1:鸢尾花种类预测 1)获取数据 2)数据集划分 3)特征工程 标准化 4)KNN预估器流程 5)模型评估 3.2.4 K-近邻总结 优点:简单,易于理解,易于实现,无需训练 缺点: 1)必须指定K值,K值选择不当则分类精度不能保证 2)懒惰算法,对测试样本分类时的计算量大,内存开销大 使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试 3.3 模型选择与调优 3.3.1 什么是交叉验证(cross validation) 3.3.2 超参数搜索-网格搜索(Grid Search) k的取值 [1, 3, 5, 7, 9, 11] 暴力破解 3.3.3 鸢尾花案例增加K值调优 3.2.4 案例:预测facebook签到位置 流程分析: 1)获取数据 2)数据处理 目的: 特征值 x 目标值 y a.缩小数据范围 2 < x < 2.5 1.0 < y < 1.5 b.time -> 年月日时分秒 c.过滤签到次数少的地点 数据集划分 3)特征工程:标准化 4)KNN算法预估流程 5)模型选择与调优 6)模型评估 3.4 朴素贝叶斯算法 3.4.1 什么是朴素贝叶斯分类方法 3.4.2 概率基础 1 概率(Probability)定义 3.4.3 联合概率、条件概率与相互独立 联合概率:包含多个条件,且所有条件同时成立的概率 P(程序员, 匀称) P(程序员, 超重|喜欢) P(A, B) 条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率 P(程序员|喜欢) P(程序员, 超重|喜欢) P(A|B) 相互独立: P(A, B) = P(A)P(B) <=> 事件A与事件B相互独立 朴素? 假设:特征与特征之间是相互独立 朴素贝叶斯算法: 朴素 + 贝叶斯 应用场景: 文本分类 单词作为特征 拉普拉斯平滑系数 3.4.6 案例:20类新闻分类 1)获取数据 2)划分数据集 3)特征工程 文本特征抽取 4)朴素贝叶斯预估器流程 5)模型评估 3.4.7 朴素贝叶斯算法总结 优点: 对缺失数据不太敏感,算法也比较简单,常用于文本分类。 分类准确度高,速度快 缺点: 由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好 我爱北京天安门 3.5 决策树 3.5.1 认识决策树 如何高效的进行决策? 特征的先后顺序 3.5.2 决策树分类原理详解 已知 四个特征值 预测 是否贷款给某个人 先看房子,再工作 -> 是否贷款 只看了两个特征 年龄,信贷情况,工作 看了三个特征 信息论基础 1)信息 香农:消除随机不定性的东西 小明 年龄 “我今年18岁” - 信息 小华 ”小明明年19岁” - 不是信息 2)信息的衡量 - 信息量 - 信息熵 bit g(D,A) = H(D) - 条件熵H(D|A) 4 决策树的划分依据之一------信息增益 没有免费的午餐 3.5.5 决策树可视化 3.5.6 决策树总结 优点: 可视化 - 可解释能力强 缺点: 容易产生过拟合 3.5.4 案例:泰坦尼克号乘客生存预测 流程分析: 特征值 目标值 1)获取数据 2)数据处理 缺失值处理 特征值 -> 字典类型 3)准备好特征值 目标值 4)划分数据集 5)特征工程:字典特征抽取 6)决策树预估器流程 7)模型评估 3.6 集成学习方法之随机森林 3.6.1 什么是集成学习方法 3.6.2 什么是随机森林 随机 森林:包含多个决策树的分类器 3.6.3 随机森林原理过程 训练集: N个样本 特征值 目标值 M个特征 随机 两个随机 训练集随机 - N个样本中随机有放回的抽样N个 bootstrap 随机有放回抽样 [1, 2, 3, 4, 5] 新的树的训练集 [2, 2, 3, 1, 5] 特征随机 - 从M个特征中随机抽取m个特征 M >> m 降维 3.6.6 总结 能够有效地运行在大数据集上, 处理具有高维特征的输入样本,而且不需要降维
相关代码
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.model_selection import GridSearchCV from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.tree import DecisionTreeClassifier, export_graphviz
def knn_iris(): """ 用KNN算法对鸢尾花进行分类 :return: """ # 1)获取数据 iris = load_iris() # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22) # 3)特征工程:标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)KNN算法预估器 estimator = KNeighborsClassifier(n_neighbors=3) 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("准确率为:\n", score) return None
def knn_iris_gscv(): """ 用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证 :return: """ # 1)获取数据 iris = load_iris() # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22) # 3)特征工程:标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)KNN算法预估器 estimator = KNeighborsClassifier() # 加入网格搜索与交叉验证 # 参数准备 param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]} estimator = GridSearchCV(estimator, param_grid=param_dict, cv=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("准确率为:\n", score) # 最佳参数:best_params_ print("最佳参数:\n", estimator.best_params_) # 最佳结果:best_score_ print("最佳结果:\n", estimator.best_score_) # 最佳估计器:best_estimator_ print("最佳估计器:\n", estimator.best_estimator_) # 交叉验证结果:cv_results_ print("交叉验证结果:\n", estimator.cv_results_) return None
def nb_news(): """ 用朴素贝叶斯算法对新闻进行分类 :return: """ # 1)获取数据 news = fetch_20newsgroups(subset="all") # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target) # 3)特征工程:文本特征抽取-tfidf 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)模型评估 # 方法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) return None
def decision_iris(): """ 用决策树对鸢尾花进行分类 :return: """ # 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) # 4)模型评估 # 方法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) # 可视化决策树 export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names) return None
实例
案例1:预测facebook签到位置(K-近邻算法)
案例2:泰坦尼克号乘客生存预测(决策树)
#%% import pandas as pd #%% # 1、获取数据 data = pd.read_csv("./FBlocation/train.csv") #%% data.head() #%% # 2、基本的数据处理 # 1)缩小数据范围 data = data.query("x < 2.5 & x > 2 & y < 1.5 & y > 1.0") #%% data.head() #%% # 2)处理时间特征 time_value = pd.to_datetime(data["time"], unit="s") #%% date = pd.DatetimeIndex(time_value) #%% data["day"] = date.day #%% data["weekday"] = date.weekday #%% data["hour"] = date.hour #%% data.head() #%% # 3)过滤签到次数少的地点 place_count = data.groupby("place_id").count()["row_id"] #%% data.groupby("place_id").count().head() #%% place_count[place_count > 3].head() #%% data_final = data[data["place_id"].isin(place_count[place_count > 3].index.values)] #%% data_final.head() #%% # 筛选特征值和目标值 x = data_final[["x", "y", "accuracy", "day", "weekday", "hour"]] y = data_final["place_id"] #%% x.head() #%% y.head() #%% # 数据集划分 from sklearn.model_selection import train_test_split #%% x_train, x_test, y_train, y_test = train_test_split(x, y) #%% from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCV #%% # 3)特征工程:标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)KNN算法预估器 estimator = KNeighborsClassifier() # 加入网格搜索与交叉验证 # 参数准备 param_dict = {"n_neighbors": [3, 5, 7, 9]} estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3) 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("准确率为:\n", score) # 最佳参数:best_params_ print("最佳参数:\n", estimator.best_params_) # 最佳结果:best_score_ print("最佳结果:\n", estimator.best_score_) # 最佳估计器:best_estimator_ print("最佳估计器:\n", estimator.best_estimator_) # 交叉验证结果:cv_results_ print("交叉验证结果:\n", estimator.cv_results_) #%%
#%% import pandas as pd #%% # 1、获取数据 path = "http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt" titanic = pd.read_csv(path) #%% titanic.head() #%% # 筛选特征值和目标值 x = titanic[["pclass", "age", "sex"]] y = titanic["survived"] #%% x.head() #%% y.head() #%% # 2、数据处理 # 1)缺失值处理 x["age"].fillna(x["age"].mean(), inplace=True) #%% # 2) 转换成字典 x = x.to_dict(orient="records") #%% from sklearn.model_selection import train_test_split # 3、数据集划分 x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22) #%% # 4、字典特征抽取 from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier, export_graphviz #%% transfer = DictVectorizer() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) #%% # 3)决策树预估器 estimator = DecisionTreeClassifier(criterion="entropy", max_depth=8) estimator.fit(x_train, y_train) # 4)模型评估 # 方法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) # 可视化决策树 export_graphviz(estimator, out_file="titanic_tree.dot", feature_names=transfer.get_feature_names()) #%% md ### 随机森林对泰坦尼克号乘客的生存进行预测 #%% 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) 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("准确率为:\n", score) # 最佳参数:best_params_ print("最佳参数:\n", estimator.best_params_) # 最佳结果:best_score_ print("最佳结果:\n", estimator.best_score_) # 最佳估计器:best_estimator_ print("最佳估计器:\n", estimator.best_estimator_) # 交叉验证结果:cv_results_ print("交叉验证结果:\n", estimator.cv_results_) #%%
作者:华王
博客:https://www.cnblogs.com/huahuawang/