机器学习入门之分类算法--sklearn

#分类算法
'''
目标值:类别
1.sklearn转换器和预估器
2.KNN算法 -- 少量数据
3.模型选择与调优 -- 
4.朴素贝叶斯算法 -- 避免0的情况 使用拉普拉斯平滑系数
5.决策树
6.随机森林
3.1 转换器和预估器
    转换器
    估计器(estimator)
    3.1.1 转换器
        1.实例化 一个转换器类
        2.调用fit_transform
        标准化:
            (x-mean)/std
            -fit: 计算每一列的平均值 标准差
            -transform: 进行最终的转换
    3.1.2 估计器(sklearn机器学习算法的实现)
        基本所有算法都继承于估计器
        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-近邻算法(KNN算法)
    3.2.1 什么是kn算法
        KNN
        2.1.1核心思想:
            根据你的邻居来给你判断你的类别
            举个例子:
                如果我在一个地方,我想知道我在哪个区,
                但是现在我只知道地图上的一些样本所在区,那么我就取离我最近的一个人的区
            定义:
                如果一个样本在特征空间当中k个最相似的样本大多数属于某一个类别,则该样本也属于这个类别
                    -  k = 1:容易受到异常点的影响
            计算距离:
                距离公式
                -欧氏距离
                a(a1,a2,a3) b(b1,b2,b3)
                sqrt((a1-b1)^2+...)
                -曼哈顿距离(绝对值距离)
                不平方,用绝对值
                -明可夫斯基距离
                欧氏距离和曼哈顿距离是明可夫斯基距离的推广
    2.1.2 电影类型分析
        k值过大,样本不均衡时会容易分错
        k值过小,容易受到异常点影响
        - 在使用算法之前,使用k-近邻算法
            需要无量纲化
                - 标准化(归一化容易受到异常值的影响)
    2.1.3 使用    
        两个参数 n_neighbors = 5:k
        algorithm = 'auto':使用算法
    2.1.4 案例1:鸢尾花种类预测
        1.获取数据
        2.数据集划分(训练集、测试集)
        3.特征工程
            - 标准化
            - 降维(这里不需要因为只有四个特征,并且该数据集整理得很好)
    2.1.5 KNN总结
        优点:简单
        缺点:
            1.对k的取值不确定     
            2.需要跟任何一个点进行计算,效率比较低,所以不合适用于数据量比较大的算法
    2.1.6 模型选择与调优
        1.什么是交叉验证(cv)
            将拿到的训练数据,再分为训练和验证集。
            例如,将数据分为四份,其中一份作为验证集
            然后经过4次的测试,每次更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证
            训练集:训练集+验证集
            测试集:测试集
            使得训练得出的模型更加准确可信
        2.超参数搜索、网格搜索
            通常情况下,有很多参数是需要手动指定的(如kNN中的k值)
    2.1.7 facebook案例--使用jupyter
3.3 朴素贝叶斯算法
    3.3.1 什么是朴素贝叶斯分类方法
        朴素:假设特征与特征之间是相互独立的
        朴素 + 贝叶斯
        应用场景:
            文本分类
            单词作为特征
            假设词与词之间相互独立
    3.3.2 贝叶斯公式
        P(A|B) = P(AB)/P(B)
        P(B|A) = P(A|B)*P(B)/P(A)
    3.3.3 拉普拉斯平滑系数
        P(F1|C) = (Ni + a)/(N + am)
        a为指定的系数一般为1,m为特征词的个数
        避免出现概率为0的情况
    3.3.4 总结
        优点:
            分类准确值高 对缺失值不敏感
        缺点:
            假定特征和特征之间相互独立
3.4决策树
    3.4.1 认识决策树
        如何高效的进行决策
        1.根据特征的先后顺序
    3.4.2 决策树原理
    eg:银行贷款数据
        已知四个特征 预测 是否给贷款
        -找到一种数学的方法快速判断先看哪种特征
    信息论基础 -- 决策树划分依据 先划分哪一个说明哪个信息增益越多
        1.信息
            香农:信息是消除随机不定性的东西
            小明 年龄 “今年18岁”
            小华:“小明明年19岁”--已经不是信息了,因为已知小明年龄所以该话没有消除随即不确定性
        2.信息的衡量(信息消除不确定性的大小)
            -信息量 - 信息熵(H)(其实就是求期望)
            -信息增益:g(D,A) = H(D) - H(D|A)
                    总的信息熵减去知道某一特征之后的条件熵
                    表示得知某特征之后不确定性减少的成都使得类Y的信息熵减少的程度 
    3.4.3 决策树划分 --信息增益
        没有免费的午餐
        决策树更适合用在数据量比较大的数据
        KNN更适合用在数据量比较小的数据
    3.4.4 决策树可视化 -- 可以进行可视化
    3.4.5 决策树总结
        优点:
            可视化 -- 可解释能力强
        缺点
            不能很好的推广至过于复杂的树,否则树的深度会很深,容易产生过拟合(对训练集拟合效果很好)
        改进:
            1.剪枝cart算法
            2.随机森林
3.5 泰坦尼克号
流程分析:特征值、目标值
    1.获取数据
    2.数据处理
        缺失值处理
        特征当中有很多类别最好转化为one-hot编码
        所以最好转化为字典类型 方便处理
    3.划分数据集
    4.特征工程:字典特征抽取
    5.决策树预估器(决策树不需要标准化)
    6.模型评估
3.6 集成学习方法 随机森林
    3.6.1 什么是集成学习方法
        通过建立几个模型组合的来解决单一预测问题,多个模型取众数
    3.6.2 什么是随机森林
        随机
        森林:包含多个决策树的分类器
    3.6.3 随机森林原理
        训练集:特征值 目标值
        随机
            两个随机
                训练集随机
                    bootstrap 随机有放回抽样
                    [1,2,3,4,5]
                    新的树的训练集
                特征随机 
                    从M个特征中随机m个特征 M>>m
                    降维 可以提高时间效率
                    笨的树会相互抵消,聪明的树会脱颖而出

        具有极好的准确率
        适合高维特征、大数据


'''
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.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
def decision_iris():
    '''
    用决策树对鸢尾花进行分类
    1.获取数据集
    2.划分数据集
    3.决策树预估器
    4.模型评估
    '''
    iris = load_iris()
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
    estimator = DecisionTreeClassifier(criterion='entropy')#entropy:表示通过信息增益进行分类
    estimator.fit(x_train,y_train)
    y_predict = estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    #方法一
    print("直接比对真实值和预测值:\n",y_test == y_predict)
    #方法二 计算准确率
    score = estimator.score(x_test,y_test)
    print("准确率:\n",score)
    #可视化决策树 生成一个文件 复制到网页进一步可视化
    export_graphviz(estimator,out_file="iris_tree.dot",feature_names=iris.feature_names)
    # webgraphviz.com
    return None
if __name__ == '__main__':
    print()
    # knn_iris()
    # knn_iris_gscv()
    decision_iris()
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_iris():
    """
    用knn算法对鸢尾花进行分类
    1.获取数据
    2.划分数据集
    3.特征工程:标准化
    4.knn算法预估器
    5.模型评估
    """
    iris = load_iris()
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=8)
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    #同样也要对测试集进行标准化
    #但是标准化包括两个一个是 fit 一个是transform
    #但是这里的fit应该要用之前的fit才能使测试集跟训练集的转换相同
    x_test = transfer.transform(x_test)
    estimator = KNeighborsClassifier(n_neighbors=4)
    estimator.fit(x_train,y_train)#这里通过预估器就有了模型
    #模型评估
    y_predict = estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    #方法一
    print("直接比对真实值和预测值:\n",y_test == y_predict)
    #方法二
    score = estimator.score(x_test,y_test)
    print("准确率:\n",score)
    return None
from sklearn.model_selection import GridSearchCV
def knn_iris_gscv():
    """
    用knn算法对鸢尾花进行分类
    添加网格搜索和交叉验证
    1.获取数据
    2.划分数据集
    3.特征工程:标准化
    4.knn算法预估器
    5.模型评估
    """
    iris = load_iris()
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=8)
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    #同样也要对测试集进行标准化
    #但是标准化包括两个一个是 fit 一个是transform
    #但是这里的fit应该要用之前的fit才能使测试集跟训练集的转换相同
    x_test = transfer.transform(x_test)
    estimator = KNeighborsClassifier()#这里就没必要加入k值了
    #加入网格搜索与交叉验证
    #参数准备
    param_dict = {"n_neighbors":[1,3,5,7,9]}
    estimator = GridSearchCV(estimator,param_grid=param_dict,cv = 10)
    estimator.fit(x_train,y_train)#这里通过预估器就有了模型
    #模型评估
    print("最佳参数:\n",estimator.best_params_)
    print("最佳结果:\n",estimator.best_score_)
    print("最佳估计器:\n",estimator.best_estimator_)
    print("交叉验证结果:\n",estimator.cv_results_)
    
    y_predict = estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    #方法一
    print("直接比对真实值和预测值:\n",y_test == y_predict)
    #方法二
    score = estimator.score(x_test,y_test)
    print("准确率:\n",score)
    return None
if __name__ == '__main__':
    print()
    # knn_iris()
    knn_iris_gscv()
#20类新闻分类
from sklearn.model_selection import  train_test_split
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
"""
1.获取数据
2.划分数据集
3.特征工程
    文本特征提取
4.朴素贝叶斯算法预估器流程
5.模型评估

"""
def nb_news():
    """
    用朴素贝叶斯算法对新闻进行分类
    """
    #用fetch下载 因为比较大
    news = fetch_20newsgroups(subset="all")#该参数表示训练集和测试集都要
    x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,random_state=8)
    #特征工程:文本特征抽取用TFIDF
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #朴素贝叶斯算法预估器流程
    estimator = MultinomialNB()
    estimator.fit(x_train,y_train)
    #模型评估
    y_predict = estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    #方法一
    print("直接比对真实值和预测值:\n",y_test == y_predict)
    #方法二
    score = estimator.score(x_test,y_test)
    print("准确率:\n",score)
    return None
if __name__ == '__main__':
    nb_news()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值