Python 笔记 MachineLearning Stage 2

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值