机器学习-分类算法

流程图

 

 

分类算法

分类算法
目标值:类别

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 总结
          能够有效地运行在大数据集上,
          处理具有高维特征的输入样本,而且不需要降维          
纪要-2

 

相关代码

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
代码1: 用KNN算法对鸢尾花进行分类
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
代码2:用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
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
代码3:用朴素贝叶斯算法对新闻进行分类
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
代码4:用决策树对鸢尾花进行分类

 

实例

案例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_)

#%%
facebook_demo
#%%

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_)

#%%
titanic_demo

 

posted @ 2021-07-05 00:21  风hua  阅读(169)  评论(0编辑  收藏  举报