import pandas as pd from sklearn.datasets import load_iris, fetch_20newsgroups from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.tree import DecisionTreeClassifier, export_graphviz from sklearn.ensemble import RandomForestClassifier def transformer_estimator(): """ 转换器和预估器 1.transformer : 特征工程 - 1.实例化 2.调用fit_transform 2.estimator : 是一类实现了算法的API, 分类, 回归, 无监督学习等算法都是其子类 工作流程 : 实例化estimator -> estimator.fit(x_test, y_test) 测试集计算, 训练 -> 调用完毕, 模型生成 -> 模型评估 1.对比真实值和预测值 y_predict = estimator.predict(x_test), y_test == y_predict ? 2.计算准确率 estimator.score(x_test, y_test) :return: """ return None def k_nearest_neighbors(): """ K-近邻算法(KNN) 核心思想 : 根据邻居判断类别 距离公式 : 欧氏距离, 曼哈顿距离, 明可夫斯基距离 无量纲化的处理 : 标准化 sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto') n_neighbors : int, 默认5, 查询使用的邻居数 algorithm : 'auto', 'ball_tree', 'kd_tree', 'brute' 选用于计算近邻的最适算法 优点 : 简单, 易于理解, 易于实现, 无需训练 缺点 : 懒惰算法, 对测试样本分类时, 计算量大, 内存开销大; 必须指定k值, k值选择不当则分类精度不能保证 使用场景 : 小规模数据, 数据范围 1,000 ~ 99,999, :return: """ # 案例 : iris分类 # 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) # 用transform是因为上一步已经对x_train fit 过了(求过了标准差等) # 4.KNN算法预估器 estimator = KNeighborsClassifier(n_neighbors=3) estimator.fit(x_train, y_train) # 5.模型评估 # 1)对比真实值和预测值 y_predict = estimator.predict(x_test) print(y_test == y_predict) # 2)计算准确率 score = estimator.score(x_test, y_test) print(score) return None def model_selection_tuning(): """ 模型选择与调优 cross validation 交叉验证 : 将拿到的训练数据, 分为训练集和验证集 如:将数据分成四份, 每份取一份为验证集, 经过四组测试, 每次更换验证集, 将四组模型结果取平均值, 又称4折交叉验证 Grid Search 超参数搜索-网格搜索 : 有很多参数是要手动指定的(如KNN中的k值), 这种叫超参数. 每组超参数都采用交叉验证来评估, 最后选出最优参数建立模型 sklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None) estimator : 估计器对象 param_grid : 估计器参数(dict){"n_neighbors":[1, 3, 5]} cv : 指定几折交叉验证 fit() : 输入训练数据 score() : 准确率 结果分析 : 最佳参数 : best_params_ 最佳结果 : best_score_ 最佳估计器 : best_estimator_ 交叉验证结果 : cv_results_ :return: """ # 案例 : iris分类, 并添加网格搜索和交叉验证 # 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) # 用transform是因为上一步已经对x_train fit 过了(求过了标准差等) # 4.KNN算法预估器 estimator = KNeighborsClassifier() # 5.加入GridSearchCV # 参数准备 param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]} # 想要测试的k值 estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10) estimator.fit(x_train, y_train) # 6.模型评估 # 1)对比真实值和预测值 y_predict = estimator.predict(x_test) print(y_test == y_predict) # 2)计算准确率 score = estimator.score(x_test, y_test) print(score) print("best_params_:", estimator.best_params_) print("best_score_:", estimator.best_score_) print("best_estimator_:", estimator.best_score_) print("cv_results_:", estimator.cv_results_) return None def facebook(): # 获取数据 data = pd.read_csv("D:/dev/resources/MLR/机器学xiday2资料/02-代码/FBlocation/train.csv") data_test = pd.read_csv("D:/dev/resources/MLR/机器学xiday2资料/02-代码/FBlocation/test.csv") # 数据处理 # 缩小数据范围, 年月日时分秒, 过滤签到次数过少的时间点 data = data.query("x < 2.5 & x > 2 & y < 1.5 & y > 1.0") 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 place_count = data.groupby("place_id").count()["row_id"] data = data[data["place_id"].isin(place_count[place_count > 3].index.values)] # 特征工程 : 标准化 x = data[["x", "y", "accuracy", "day", "weekday", "hour"]] y = data["place_id"] x_train, x_test, y_train, y_test = train_test_split(x, y) transform = StandardScaler() x_train = transform.fit_transform(x_train) x_test = transform.transform(x_test) # KNN estimator = KNeighborsClassifier() # 模型选择与调优 param_dict = {"n_neighbors": [3, 5, 7, 9]} # 想要测试的k值 estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3) estimator.fit(x_train, y_train) # 模型评估 # 1)对比真实值和预测值 y_predict = estimator.predict(x_test) print(y_test == y_predict) # 2)计算准确率 score = estimator.score(x_test, y_test) print(score) print("best_params_:", estimator.best_params_) print("best_score_:", estimator.best_score_) print("best_estimator_:", estimator.best_score_) print("cv_results_:", estimator.cv_results_) return None def bayes(): """ Bayes' theorem 贝叶斯公式 : P(A|B) = P(B|A)P(A) / P(B) , 在B已经发生的条件下, A发生的概率 Naive Bayes 朴素贝叶斯 : 假设特征与特征之间相互独立 P(A,B) = P(A)P(B) Laplacian smoothing 拉普拉斯平滑系数 : P(F1|C) = (Ni + a) / (N + am) , 目的是防止计算出的分类概率为0 a指定系数一般为1, m为训练文档中统计出特征词的个数 sklearn.naive_bayes.MultinomialINB(alpha=1.0) :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.fit_transform(x_test) # 4.朴素贝叶斯算法预估器流程 estimator = MultinomialNB() estimator.fit(x_train, y_train) # 5.模型评估 # 1)对比真实值和预测值 y_predict = estimator.predict(x_test) print(y_test == y_predict) # 2)计算准确率 score = estimator.score(x_test, y_test) print(score) return None def decision_tree(): """ 信息论基础 : 信息的衡量 - 信息量 - 信息熵 H(x) = -∑P(xi)logb(P(xi)) 决策树分类器 sklearn.tree.DecisionTreeClassifier(criterion="gini", max_depth=None, random_state=None) criterion : 默认gini系数, 也可以选择信息增益的熵entropy max_depth : 树的深度 random_state : 随机种子 决策树可视化 sklearn.tree.export_graphviz(estimator, out_file=" ", feature_names=[" ", " "] 该文件可以导出DOT格式 out_file : 文件路径 feature_names : 特征名称 优点 : 简单的理解和解释, 可视化 缺点 : 可能会过拟合 :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_test == y_predict) # 2)计算准确率 score = estimator.score(x_test, y_test) print(score) # 5.决策树可视化 # export_graphviz(estimator, out_file="iris_tree.dot") 在webgraphviz.com中查看树 return None def random_forest(): """ 两个随机 : 1.训练集随机 bootstrap 随机放回抽样 2.特征随机 从M个特征中随机抽取m个特征 M >> m, 起到降维的效果 sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion="gini", max_depth=None, bootstrap=True, random_state=None, min_samples_split=2) 随机森林分类器 n_estimators : 森林中的树木数量 criterion : 分割特征的测量方法 max_depth : 树的最大深度 bootstrap : 是否在构建树时采用放回抽样 min_samples_split : 节点划分的最小样本数 min_samples_leaf : 叶子节点的最小样本数 :return: """ if __name__ == "__main__": # 代码1:KNN算法 # k_nearest_neighbors() # 代码2:GridSearchCV # model_selection_tuning() # 代码3:案例 预测Facebook签到位置 # facebook() # 代码4:朴素贝叶斯算法 # bayes() # 代码5:决策树 # decision_tree() # 代码6:随机森林 # random_forest() print()
Python 笔记 MachineLearning Stage 2
最新推荐文章于 2024-11-03 00:03:15 发布