机器学习分类算法

机器学习的步骤

  1.         获取数据  --->数据预处理(缺失值、异常值)--->数据集的划分(训练集和测试集)--->特征工程(特征抽取、特征预处理、特征降维)--->模型训练(调用sklearn中的方法)--->模型评估(比对预测值和真实值、计算准确率等)
  2. 案例数据集下载:百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1kq3PZtTaLFM9P_z-qtl4vw?pwd=i523

         百度网盘:提取码:i523

一、K近邻算法:

基本定义:就近原则来确定类别,距离公式、K的取值:K值多小,容易受到异常值的影响、K值过大容易受到样本不均衡的影响,主要应用于数据量少的预测。

        案例1:使用sklearn自带的数据集,对鸢尾花进行分类

# coding = utf-8
# 导入sklearn自带的数据集
from sklearn.datasets import load_iris
# 导入训练集测试集的划分器
from sklearn.model_selection import train_test_split
# 导入标准化库
from sklearn.preprocessing import StandardScaler
# 导入KNN算法预估器
from sklearn.neighbors import KNeighborsClassifier
# 导入网格搜索
from sklearn.model_selection import GridSearchCV


def iris_knn_cv():
    """
    用KNN算法对iris进行分类,网格搜索和交叉验证
    :return:
    """
    # 获取数据集
    iris = load_iris()

    # 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)  # random_state随机种子

    # 标准化
    # 实例化转换器
    transfer = StandardScaler()

    # 调用转换器
    # 训练集标准化
    x_train = transfer.fit_transform(x_train)
    # 测试集标准化
    x_test = transfer.transform(x_test)

    # KNN 算法预估器
    # 实例化一个预估器类
    estimator = KNeighborsClassifier(n_neighbors=6)  # n_neighbors=6 相当于k=6

    # 加入网格搜索和交叉验证
    # 参数准备
    params_dict = {'n_neighbors': [1, 3, 5, 7, 9, 11]}
    estimator = GridSearchCV(estimator, param_grid=params_dict, cv=10)
    estimator.fit(x_train,  y_train)
    # 模型训练
    estimator.fit(x_train, y_train)

    # 模型评估
    # 方法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)

    print("最佳参数:", estimator.best_params_)
    print("最佳结果:", estimator.best_score_)
    print("最佳预估器:", estimator.best_estimator_)
    print("交叉验证结果:", estimator.cv_results_)
    return None


if __name__ == "__main__":
    iris_knn_cv()

        案例2:使用K近邻算法对face_boo用户签到预测

        

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

data = pd.read_csv("D:\\机器学习\\数据集\\fece_book\\train.csv")
# 缩小数据范围
data1 = data.query("x >2 & x <2.5 & y > 1.0 & y < 1.5")
# 处理时间戳,unit="s"表示指点时间为s
time_value = pd.to_datetime(data1["time"], unit="s")
date = pd.DatetimeIndex(time_value)
# 添加日期day
data1["day"] = date.day
# 添加星期
data1["week"] = date.week
# 添加小时
data1["hour"] = date.hour
# 过滤掉签到次数少的地点
place_count = data1["row_id"].groupby(by=data1["place_id"]).count()
# 过滤掉签到次数小于3
place_count = place_count[place_count > 3]
# 返回DataFrame
data1_final = data1[data1["place_id"].isin(place_count.index.values)]
# 筛选特征值和目标值
# 特征值
x = data1_final[["x", "y", "accuracy", "day", "week", "hour"]]
# 目标值
y = data1_final["place_id"]
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 特征工程
# 1、标准化
# 实例化转换器
transfer = StandardScaler()
# 调用转换器
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# KNN算法预估器
estimator = KNeighborsClassifier()

# 加入网格搜索与交叉验证
# 1、参数准备
params_dict = {"n_neighbors": [3, 5, 7, 9]}
# 网格搜索
estimator = GridSearchCV(estimator, param_grid=params_dict, cv=3)
estimator.fit(x_train, y_train)

# 模型评估
# 方法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)

# 最佳参数
print("最佳参数:", estimator.best_params_)
# 最佳结果
print("最佳结果:", estimator.best_score_)
# 最佳预估器
print("最佳预估器:", estimator.best_estimator_)
# 交叉验证结果
print("交叉验证结果:", estimator.cv_results_)

二、朴素贝叶斯算法:

        1、朴素:假设特征与特征之间相互独立
        2、贝叶斯:贝叶斯公式
        3、拉普拉斯平滑系数
        4、优点:对缺失数据不敏感,计算快
        5、缺点:概率值与样本之间的关系
        6、应用场景:文本分类

        案例3:用朴素贝叶斯对新闻文本分类、sklearn自带的数据集

# coding = utf-8
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
# 文本特征抽取
from sklearn.feature_extraction.text import TfidfVectorizer
# 贝叶斯转换器
from sklearn.naive_bayes import MultinomialNB


def nb_new():
    """
    使用朴素贝叶斯算法对文本分类
    :return:
    """
    # 获取数据集,默认是训练集,改成all表示全部下载
    data = fetch_20newsgroups(subset="all")
    # 数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target)

    # 特征工程,文本特征抽取
    # 实例化转换器
    transfer = TfidfVectorizer()
    # 调用转换器
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 贝叶斯算法预估器
    estimator = MultinomialNB()
    # 模型训练
    estimator.fit(x_train, y_train)

    # 模型评估
    # 方法1:直接比对真实值与预测值
    y_predict = estimator.predict(x_test)
    print("y_predict", y_predict)
    print("直接比对真实值与预测值:\n", y_test == y_predict)

    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("计算准确率:", score)
    print("x_train", x_train)

    return None


nb_new()

三、决策树

        1、决策:找到最高效的决策顺序 -- 信息增益,信息增益:信息熵 - 条件熵

        2、优点:能够可视化、可解释能力强

        3、缺点:容易过拟合

        案例4:决策树对泰坦尼克乘客生存预测

import pandas as pd
# 字典特征抽取
from sklearn.feature_extraction import DictVectorizer
# 数据集划分
from sklearn.model_selection import train_test_split
# 决策数预估器
from sklearn.tree import DecisionTreeClassifier, export_graphviz
titanic = pd.read_csv('./titanic/train.csv')
# 赛选特征值和目标值的选择
# 1、特征值
x = titanic[["Pclass", "Sex", "Age"]]
y = titanic[["Survived"]]
# 缺失值的处理, 2   Age     714 non-null    float64
# 年龄段有缺失值,使用平均值填充
x.loc[:, "Age"].fillna(x["Age"].mean(), inplace=True)
# 转换成字典,orient="records"表示转换的格式
x = x.to_dict(orient="records")
# 数据集的划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)  # random_state=22 随机种子
# 实例化字典转换器
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 实例化预估器
estimator = DecisionTreeClassifier(criterion="entropy")  # criterion="entropy"计算信息增益
# 模型训练
estimator.fit(x_train, y_train)
# 模型评估
# 计算准确率
score = estimator.score(x_test, y_test)
print("计算准确率:", score)
# 决策树可视化
export_graphviz(estimator, out_file="./决策树可视化泰坦尼克.dot", feature_names=transfer.get_feature_names())

四、随机森林:

        1、随机: 训练集随机
                 特征随机:降维,降低模型复杂度
        2、森林:多个决策树
        3、应用场景:高维度特征,大数据

        案例5:随机森林泰坦尼克乘客生存预测

import pandas as pd
from sklearn.model_selection import train_test_split
# 网格搜索
from sklearn.model_selection import GridSearchCV
# 集成方法中的随机森林
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
data = pd.read_csv('titanic/train.csv')
# 特征值和目标值的筛选
# 1、特征值
x = data[["Pclass", "Sex", "Age"]]
y = data[["Survived"]]
# 年龄缺失值的填充,平均值填充
x.loc[:, "Age"].fillna(x["Age"].mean(), inplace=True)
# 特征抽取 转换成字典,orient="records"表示转换的格式
x = x.to_dict(orient="records")
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)  # random_state=22 随机种子
#  实例化字典转换器
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 随机森林
estimator = RandomForestClassifier()
# 加入网格搜索和交叉验证
param_dict = {"n_estimators": [120, 240, 330, 500, 800, 1200], "max_depth": [5, 7, 9, 13, 24, 36]}
# 交叉验证和网格搜索
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 模型评估
# 计算准确率
score = estimator.score(x_test, y_test)
print("准确率:", score)
# 最佳参数
print("最佳参数:", estimator.best_params_)
print("最佳结果:", estimator.best_score_)
print("最佳预估器:", estimator.best_estimator_)
print("交叉验证结果:", estimator.cv_results_)

五、总结

分类算法:1、K近邻算法:适用于数据量小的分类

                 2、朴素贝叶斯:适用于文本分类,特征与特征之间要相互独立

                3、决策树:适用于需要可视化的流程

                4、随机森林:适用于高维度特征、大数据场景。

你可能感兴趣的:(机器学习)