ml_2

  • 内容
    • 转换器与预估器
    • KNN算法
    • 模型选择与调优
    • 朴素贝叶斯算法
    • 决策树与随机森林

转换器与预估器

  • 特征工程流程

    • 1.实例化一个转换器类(transformer)
    • 2.调用transformer.fit_transform()方法
    • fit():计算,transform():利用fir()计算的结果进行后续转化
  • 预估器

    • 是一类实现了算法的API。
    • 将预处理好的数据交给预估器,就可以训练出模型
    • 分类
      • 1.用于分类的预估器
        • sllwarn.neighbors:K-近邻算法
        • sklwarn.naive_baves:朴素贝叶斯算法
        • sklwarn.linear_model.LogisticRegression:逻辑回归
        • sklearn.tree:决策树与随机森林
      • 2.用于回归的预估器
        • sklearn.linear_model.linearRegression:线性回归
        • sklearn.linear_model.Ridge:岭回归
      • 3.用于聚类的预估器
        • sklearn.cluster.KMeans:Kmeans算法
    • 预估器使用流程
    • 1.实例化一个预估器estimator
    • 2.训练:estimater.fit(x_train, y_train)
    • 3.模型评估:

      • 1)比对真实值(y_test)和预测值(y_predict=estimator.predict(x_test)
      • 2)直接计算准确率:estimator.score(x_test, y_test)
    • 将训练集交给预估器,就可以训练出模型,然后评估模型

KNN算法

  • 是一种判断类别(目标值是类别)的算法
  • 根据我的邻居来判断我的类别
  • 距离计算使用欧式距离计算公式

    • a(a1,b1,a3),b(b1,b2,b3)之间的距离:根号下((a1-b1)^2+(a2-b2)^2+(a3-b3)^2)
    • 如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别

      • K的值会影响到最终结果
  • API

    • sklearn.neighbors.KNeighBorsClassifier(n_neighbors=5,algorithm='auto')
      • n_neighbors:int,可选(默认5),即K值,设置查询的邻居的个数
      • algorithm:可选的算法
  • 示例:KNN算法对鸢尾花进行分类

    • 流程
        1. 获取数据集
        1. 划分数据集
        1. 特征工程:标准化
        1. KNN预估器流程
          • 1)实例化预估器类
          • 2)fit数据进行训练
        1. 评估模型效果
          • 方法1:比对测试集的预测值和真实值
          • 方法2:直接计算准确率
    • 示例:
    def knn_iris():
    """
    用knn算法对鸢尾花进行分类
    :return: None
    """
    
    # 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=9)
    estimator.fit(x_train, y_train)
    
    # 5.模型评估
    
    
    # 方法1:比对真实值和预测值
    
    y_predict = estimator.predict(x_test)
    print("预测的结果为:\n", y_predict)
    print("比对真实值和预测值:\n", y_test == y_predict)
    
    # 方法2:直接计算准确率
    
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    return None
    
    • 总结
    • 优点:简单,易于理解,易于实现
    • 缺点:计算量大,事件复杂度高,内存开销大
    • 适用场景:小数据场景,几千到几万

模型选择与调优

  • 交叉验证
    • 为了让被评估的模型更加准确可信
    • 更好的利用训练集数据
      • 将拿到的训练集数据,分为若干组(几组叫做几折)再次分为训练集和验证集,每一组的训练集训练后,用每一组的验证集进行验证,最后,取各组验证机的平均值表示模型的训练结果
  • 超参数:需要手动设置的参数。如knn算法中的K值
  • 网格搜索

    • 可以自动对超参数进行交叉验证,最后选择最优参数集
  • API:sklwarn.model_selection.GridSearchCV(estimator, param_grid=Nnone,cv=None)

    • 对估计器,自动对指定的超参数集进行享尽的搜索(网格搜索);对训练集数据进一步优化处理(交叉验证)
    • estimator:估计器对象
    • param_grid:估计器的K参数(dict){“n_neighbors”:[1,3,5]}
    • cv:指定几折交叉验证(分为几组)
    • 然后使用fit函数训练数据
    • 使用score查看训练的结果
    • 对结果进行分析:
      • best_score_:在交叉验证中最好的结果
      • best_estimator_:最好的参数模型
      • cv_results_:每次交叉验证后的准确率结果
    • 可对用KNN算法对鸢尾花进行分类的例子,加上网格搜索和交叉验证

def knn_iris():
    """
    用knn算法对鸢尾花进行分类
    :return: None
    """
    # 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)
    # x_test = transfer.fit_transform(x_test)
    # 4、KNN预估器流程
    estimator = KNeighborsClassifier(n_neighbors=9)
    estimator.fit(x_train, y_train)
    # 5、模型评估
    # 方法1:比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("预测结果为:\n", y_predict)
    print("比对真实值和预测值:\n", y_predict == y_test)
    # 方法2:直接计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    return None


def knn_iris_gscv():
    """
    用knn算法对鸢尾花进行分类,加入网格搜索和交叉验证
    :return: None
    """
    ...
    # 模型选择与调优
    # 网格搜索和交叉验证
    # 构造超参数的字典
    param_dict = {"n_neighbors": [1, 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("预测结果为:\n", y_predict)
    print("比对真实值和预测值:\n", y_predict == y_test)
    # 方法2:直接计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    # 6、交叉验证和网格搜索的结果
    print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
    print("最好的参数模型:\n", estimator.best_estimator_)
    print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)


    return None

朴素贝叶斯算法

  • 假定特征之间相互独立的,利用贝叶斯公式的分类算法,如文章的分类
  • 朴素:假定特征与特征之间相互独立
  • 贝叶斯:贝叶斯公式

    • P(C|W)=P(W|C)*P(C)/P(W)
    • 需要配合拉普拉斯平滑系数一起作用
  • API

    • sklearn.naive_bayes.MultinomialNB(alpha=1.0)
      • 朴素贝叶斯分类
      • alpha:拉普拉斯平滑系数
  • 案例:对新闻进行分类
def knn_facebook():
    """
    用KNN算法预测Facebook签到位置
    :return: None
    """
    # 1、获取数据集
    facebook = pd.read_csv("./FBlocation/train.csv")
    # 2、基本的数据处理,拿到特征值和目标值
    # 1)缩小数据范围
    facebook = facebook.query("x > 1.0 & x <1.25 & y > 2.0 & y < 2.25")
    # 2)选取有用的时间特征
    time_value = pd.to_datetime(facebook["time"], unit="s")
    time_value = pd.DatetimeIndex(time_value)
    facebook["day"] = time_value.day
    facebook["hour"] = time_value.hour
    facebook["weekday"] = time_value.weekday
    # 3)去掉签到较少的地点
    place_count = facebook.groupby("place_id").count()
    place_count = place_count[place_count["row_id"] > 3]
    facebook = facebook[facebook["place_id"].isin(place_count.index)]
    # 4)拿到特征值x和目标值y
    x = facebook[["x", "y", "accuracy", "day", "hour", "weekday"]]
    y = facebook["place_id"]
    # 3、数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
    # 4、特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 5、KNN预估器流程
    estimator = KNeighborsClassifier()
    # 6、模型选择与调优
    # 准备好超参数
    param_dict = {"n_neighbors": [5, 7, 9]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
    estimator.fit(x_train, y_train)
    # 7、模型评估
    # 方法1:比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("预测结果为:\n", y_predict)
    print("比对真实值和预测值:\n", y_predict == y_test)
    # 方法2:直接计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    # 6、交叉验证和网格搜索的结果
    print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
    print("最好的参数模型:\n", estimator.best_estimator_)
    print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)

    return None

def nb_news():
    """
    用朴素贝叶斯算法对新闻进行分类
    :return: None
    """
    # 1、获取数据集
    news = fetch_20newsgroups(data_home="./news", subset="all")
    # print("news数据集返回结果:\n", news)
    # 2、划分数据集
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, random_state=6)
    # 3、特征工程:文本特征抽取TF-IDF
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    # x_test一定要用transform
    x_test = transfer.transform(x_test)
    # x_test = transfer.fit_transform(x_test)
    # 4、预估器流程
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)
    # 5、模型评估
    score = estimator.score(x_test, y_test)
    print("新闻分类的准确率为:\n", score)

    return None
  • 总结
    • 优点
      • 对缺失数据不敏感
      • 稳定,快
    • 缺点:
      • 因为使用了用本属性独立性的假设,所以不适用于关联性强的特征的情况
    • 使用场景:
    • 对文本的分类

决策树与随机森林

决策树

  • 基于if-else语句,用最快的选择顺序逐渐确定分类结果
  • 怎么判断先选择哪个,再选择哪个?–先选择信息增益最大的那个
    • 信息增益:表示得知特征x的信息,而使得Y信息的不确定性减少的程度
  • API:sklearn.tree.DicisionTreeClassfier(criterion=’gini’,max_depth=None)
    • 决策树分类器
    • criterion:默认是’gini‘基尼系数,也可以选择信息增益的熵’entropy‘
    • max_depth:数的深度大小
  • 可视化决策树

    • 决策树的决策流程,可以可视化
    • 步骤:
      • 1.将决策流程导出为dot格式
        • sklearn.tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
      • 2.安装graphviz
        • Ubuntu:ubuntu:sudo apt-get install graphviz;Mac:brew install graphviz
      • 3.运行命令
        • $ dot -Tpng tree.dot -o tree.png
  • 示例:

def decision_iris():
    """
    用决策树算法对鸢尾花进行分类
    :return: None
    """
    # 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", max_depth=4)
    estimator.fit(x_train, y_train)
    # 4、模型评估
    # 比对
    y_predict = estimator.predict(x_test)
    print("预测的结果:\n", y_predict)
    print("预测结果和真实值的比对:\n", y_predict == y_test)
    # 准确率
    score = estimator.score(x_test, y_test)
    print("准确率:\n", score)
    # 5、可视化决策树
    export_graphviz(estimator, out_file="tree.dot", feature_names=iris.feature_names)

    return None
  • 总结:
    • 优点
      • 只需要很少的数据准备,不需要标准化
      • 树木可视化
    • 缺点
      • 容易过拟合,不稳定
    • 使用场景
      • 有很好的分析能力,在企业决策过程中应用较多

随机森林

  • 包含多个决策树的分类器
    • 输出的类别是由个别树输出的类别的众数而定
  • 集成学习方法

    • 集成学习通过建立几个模型组合的形式来解决单一预测问题
    • 原理是生成多个分类器/模型,各自独立的学习和作出判断。
    • 这些预测最后结合成单预测
    • 因此集成学习预测的结果优于任何一个单分类作出的预测
  • 随机

    • 训练集随机
      • 总共有N个样本,从这N个样本中,随机有放回的抽取m个样本作为单个决策树的训练集(bootstrap)
    • 特征随机
      • 总共N个特征,从这N个特征中随机的抽取m个特征作为单个训练集的特征集
  • 为什么要随机

    • 1.预测能力不好的树会相互抵消
    • 2.随机的方式增强了树之间的不相关性
    • 每一个决策树有相同数量的n个样本,增强了每棵决策树的分类能力
  • API:

    • sklearn.ensenble.RandomForestClassifier(n_estimators=10, criterrion='gini', max_depth=None), boostrap=True
    • 随机森林分类器
    • n_estimator:森林里的树木数量
    • criteria:分割特征的测量方法
    • max_depth:数的最大深度
    • bootstrap:是否在构建树时放回抽样
  • 示例:

def forest_titanic_true():
    """
    用随机森林对泰坦尼克号乘客进行分类
    :return:
    """
    # 1.获取数据集
    titanic = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    # 2.基本数据处理
    # 筛选出特征值、目标值
    x = titanic[["pclass", "age", "sex"]]
    y = titanic["survived"]
    # 处理缺失值
    x["age"].fillna(value=x["age"].mean(), inplace=True)
    # 将特征值转换成字典类型
    x = x.to_dict(orient="records")
    # 3.划分数据集
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
    # 4.特征工程:字典特征抽取
    transfer = DictVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 5.预估器流程
    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)
    # 4、评估模型效果
    # 方法a:比对预测结果和真实值
    y_predict = estimator.predict(x_test)
    print("比对预测结果和真实值:\n", y_predict == y_test)
    # 方法b:直接计算准确率
    score = estimator.score(x_test, y_test)
    print("直接计算准确率:\n", score)
    # 6、交叉验证和网格搜索的结果
    print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
    print("最好的参数模型:\n", estimator.best_estimator_)
    print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)

    return None
  • 总结:
    • 优点
      • 准确率高
      • 适合大数据集
      • 不需要降维
    • 使用场景
    • 大数据分类场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值