day02-机器学习打卡

from sklearn.datasets import load_iris       #从sklearn.datasets中导入鸢尾花数据集
from sklearn.model_selection import train_test_split   #从sklearn.model_selection中导入划分数据集
from sklearn.preprocessing import StandardScaler       #从sklearn.preprocessing中导入标准化
from sklearn.neighbors import KNeighborsClassifier     #sklearn.neighbors中导入Knn分类器
import numpy as np
import pandas as pd                                    #数据处理;以及获取数据
from sklearn.model_selection import GridSearchCV       #从模型选择中导入gridsearchCV(交叉验证网格搜索)
from sklearn.datasets import fetch_20newsgroups        #从sklean.datasets中导入20分类的数据集
from sklearn.feature_extraction.text import TfidfVectorizer     #从sklearn的特征提取的文本中导入Tfidf
from sklearn.naive_bayes import MultinomialNB                           #从sklearn.naviebyes中导入multionmianlNB(导入贝叶斯算法)
from sklearn.tree import DecisionTreeClassifier,export_graphviz         #从sklearn.tree中导入决策树分类器;决策树可视化
from sklearn.feature_extraction import DictVectorizer         #从sklearn.特征提取中导入字典特征抽取器
from sklearn.ensemble import RandomForestClassifier           #从sklearn.集成学习方法中导入随机森林分类器


def KNN_iris():
    """
    使用K-近邻算法(KNN)对鸢尾花数据集进行分类
    :return:
    """
    #1、获取数据集
    iris=load_iris()         #加载进来是bunch(继承字典形式)  (150*4)
    data=iris["data"]        #这是iris中的特征数据集(特征值)
    target=iris['target']    #这是iris中的每个数据对应的标签(目标值)

    #2、划分数据集
    X_train, X_test, y_train, y_test=train_test_split(data,target,random_state=22)     #这个test_size可以选择;也可以不填
              # 这里test_size和random_state(随机种子的值都会影响最后的分类准确率)

    #3、特征工程---标准化(这里训练集和测试集都要做先相同的特征处理,只有保持一样才能后续推进)
    transfer=StandardScaler()
    X_train=transfer.fit_transform(X_train)    #将数据集中训练集的特征值传进来 #fit_transform=fit()计算+transform()转换

    #这里需要注意的是我们用训练集来进行模型的训练---测试的使用要用的是训练集模型的平均值和标准差,这样两者之间所做的工作才是一样的,测试集直接转换即可
    X_test=transfer.transform(X_test)          #测试集使用训练集的平均值和标准差,测试集直接转换即可;测试集的数据不能参与运算

    #4、KNN算法预估器流程
    #4.1、实例化预估器类
    estimator=KNeighborsClassifier(n_neighbors=5)   #设定K值,参数不同,结果都是不同的
    #4.2、调用fit()将特征值和目标值传入到这个预估器类中,进行模型的搭建(模型搭建要使用的是训练集的数据)--fit()完成后就有了模型
    estimator.fit(X_train,y_train)

    #5、模型评估
    #方法1、直接比对真实值和预测值
    count=0
    y_predict=estimator.predict(X_test)   #将测试值传入到模型中,得到预测值,然后比对预测值与真实的y_test
    print("y_predict:\n",y_predict)         #返回的结果是numpy类型

    result=(y_test==y_predict)
    print("直接比对真实值和预测值:\n",y_test==y_predict)   #返回的结果是bool型数据,是一个数组类型

    print("True的个数:\n",np.sum(result!=0))   #np.sum(result!=0)可以计算numpy中True的个数,numpy.size----计算numpy中元素的个数
    print("预测正确率为:\n",np.sum(result!=0)/y_predict.size*100)


    #方法2、计算准确率
    acc=estimator.score(X_test,y_test)   #将测试集的特征值和测试集的目标值放到score中就可以直接计算其正确率了
    print("预测准确率为:\n",acc*100)

    return  None

def KNN_iris_gscv():
    """
    用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    :return:
    """
    #1、获取数据集
    iris=load_iris()         #加载进来是bunch(继承字典形式)  (150*4)

    #2、划分数据集
    X_train, X_test, y_train, y_test=train_test_split(iris["data"],iris['target'],random_state=6)
              # 这里test_size和random_state(随机种子的值都会影响最后的分类准确率)

    #3、特征工程---标准化(这里训练集和测试集都要做先相同的特征处理,只有保持一样才能后续推进)
    transfer=StandardScaler()
    X_train=transfer.fit_transform(X_train)    #将数据集中训练集的特征值传进来 #fit_transform=fit()计算+transform()转换

    #这里需要注意的是我们用训练集来进行模型的训练---测试的使用要用的是训练集模型的平均值和标准差,这样两者之间所做的工作才是一样的,测试集直接转换即可
    X_test=transfer.transform(X_test)          #测试集使用训练集的平均值和标准差,测试集直接转换即可;测试集的数据不能参与运算

    #4、KNN算法预估器流程
    #4.1、实例化预估器类
    estimator=KNeighborsClassifier()        #这个地方就没比较写入超参数了,后面直接就验证交叉验证的结果了

    #加入网格搜索与交叉验证--在这里要测试超参数(参数准备)---这里传入的是字典,可以多传入自己超参数;
    param_grid = {"n_neighbors": [1,3,5,7,11]}
    estimator=GridSearchCV(estimator,param_grid,cv=10)  #cv是指交叉验证的次数;样本量少时cv可以大一些;样本量大的时候cv可以小一些;
    #4.2、调用fit()将特征值和目标值传入到这个预估器类中,进行模型的搭建(模型搭建要使用的是训练集的数据)--fit()完成后就有了模型
    estimator.fit(X_train,y_train)

    #5、模型评估
    #方法1、直接比对真实值和预测值
    count=0
    y_predict=estimator.predict(X_test)   #将测试值传入到模型中,得到预测值,然后比对预测值与真实的y_test
    print("y_predict:\n",y_predict)         #返回的结果是numpy类型

    result=(y_test==y_predict)
    print("直接比对真实值和预测值:\n",y_test==y_predict)   #返回的结果是bool型数据,是一个数组类型

    print("True的个数:\n",np.sum(result!=0))   #np.sum(result!=0)可以计算numpy中True的个数,numpy.size----计算numpy中元素的个数
    print("预测正确率为:\n",np.sum(result!=0)/y_predict.size*100)


    #方法2、计算准确率
    acc=estimator.score(X_test,y_test)   #将测试集的特征值和测试集的目标值放到score中就可以直接计算其正确率了
    print("预测准确率为:\n",acc*100)
    #因为使用了网格搜索-交叉验证,后面的这些结果都可以进行查看
    #最佳参数:best_params_
    print("最佳参数:\n",estimator.best_params_)
    #最佳结果:best_score_
    print("最佳结果:\n", estimator.best_score_)      #这里的最佳结果指的是进行10交叉验证后的10次平均值的最后结果
    #最佳估计器:best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    #交叉验证结果:cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)
    return  None

def facebook_demo():
    """
    Facebook签到预测
    :return:
    """
    #1、获取数据
    data=pd.read_csv("./FBlocation/train.csv")  #数据量大小(29118021, 6);数据类型为DataFrame
    #2、基本数据处理
    #2.1、缩小数据范围
    data=data.query("x>2 & x<2.5 & y>1.0 & y<1.5")    #query是对dataframe进行查询的语句,返回的也是dataframe类型现在数据缩小为(83197, 6)
    #2.2、将时间处理为更有意义的时间--
    time_value=pd.to_datetime(data['time'],unit="s")  #to_datetime方法可以解析多种不同的日期表示形式;默认的时间单位是ms,unit可以更改时间的单位;pandas的series
                                                 #to_datetime转换时间格式
    values=time_value.values            #time_value是pandas中的series数据类型;现在获取series中的values,time_value.values是个numpy类型

    time=pd.DatetimeIndex(values)       #DatetimeIndex()对某一列进行转换,同时把该列设置我索引index---可以更方便的获取年月日;转化我年月日时分秒的datatimeindex形式了
                                        #这样就可以很轻松的获取时间戳里的年月日,时分秒和星期几了
    # print("获取datatimeindex中的相关时间:\n",time.year,time.month,time.day,time.weekday,time.hour,time.minute,time.second)
    data["day"] = time.day              #这三句话的代码作用是在原来的dataframe中又重新添加了三个series
    data["weekday"] = time.weekday
    data["hour"] = time.hour
    print("数据显示:\n",data)

    #2.3、过滤掉签到次数比较少的地点(不同的place_id有不同的签到次数)
    group=data.groupby("place_id")      #将dataframe按照其中的一个列标签进行分组;分组后返回一个groupby对象
    place_count = group.count()['row_id']               #这样就可以place_id为索引,统计他的个数了;现在拿到的是一个row_id签到次数的表;series类型
    place_count=place_count[place_count>3]             #series包含两部分,分别为index和values
    print("place_count:\n",place_count)
    data_final=data[data['place_id'].isin(place_count.index.values)]
                                                        #判断data['place_id']是否在place_count.index中
                                                          # DataFrame.isin(values)
    print(data_final.head())
    #筛选特征值与目标值---自己可以根据自己喜欢的方式进行索引
    x=data_final[["x",'y','accuracy','day','weekday','hour']]     #dataframe获取列的索引方法
    y=data_final[["place_id"]]
    print("特征值x显示:\n", x)
    print("目标值y显示:\n", y)

    #数据集划分
    X_train, X_test, y_train, y_test=train_test_split(x,y)  #分别传入目标值和特征值即可完成自动划分工作

    # 3、特征工程---标准化(这里训练集和测试集都要做先相同的特征处理,只有保持一样才能后续推进)
    transfer = StandardScaler()
    X_train = transfer.fit_transform(X_train)  # 将数据集中训练集的特征值传进来 #fit_transform=fit()计算+transform()转换

    # 这里需要注意的是我们用训练集来进行模型的训练---测试的使用要用的是训练集模型的平均值和标准差,这样两者之间所做的工作才是一样的,测试集直接转换即可
    X_test = transfer.transform(X_test)  # 测试集使用训练集的平均值和标准差,测试集直接转换即可;测试集的数据不能参与运算

    # 4、KNN算法预估器流程
    # 4.1、实例化预估器类
    estimator = KNeighborsClassifier()  # 这个地方就没比较写入超参数了,后面直接就验证交叉验证的结果了

    # 加入网格搜索与交叉验证--在这里要测试超参数(参数准备)---这里传入的是字典,可以多传入自己超参数;
    param_grid = {"n_neighbors": [3,4, 5, 6,7,8, 9]}
    estimator = GridSearchCV(estimator, param_grid, cv=5)  # cv是指交叉验证的次数;样本量少时cv可以大一些;样本量大的时候cv可以小一些;
    # 4.2、调用fit()将特征值和目标值传入到这个预估器类中,进行模型的搭建(模型搭建要使用的是训练集的数据)--fit()完成后就有了模型
    estimator.fit(X_train, y_train)

    # 5、模型评估
    # 方法2、计算准确率
    acc = estimator.score(X_test, y_test)  # 将测试集的特征值和测试集的目标值放到score中就可以直接计算其正确率了
    print("预测准确率为:\n", acc * 100)
    # 因为使用了网格搜索-交叉验证,后面的这些结果都可以进行查看
    # 最佳参数:best_params_
    print("最佳参数:\n", estimator.best_params_)
    # 最佳结果:best_score_
    print("最佳结果:\n", estimator.best_score_)  # 这里的最佳结果指的是进行10交叉验证后的10次平均值的最后结果
    # 最佳估计器:best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)
    return None

def naivebyes_new_demo():
    """
    用朴素贝叶斯算法对新闻进行分类
    :return:
    """
    #1、获取数据
    news=fetch_20newsgroups(subset="all")              #data_home指的是这个数据要下载到什么位置(如果不设定就指定到家目录下)

    #2、划分数据集
    X_train, X_test, y_train, y_test=train_test_split(news.data,news.target,random_state=20)     #里面传入特征值和目标值,后面的参数可以传也可以不传

    #3、特征工程--文本特征抽取---推荐使用tf-idf方式(经过下面步骤训练集和测试集的特征都抽取好了)
    transfer=TfidfVectorizer()
    X_train=transfer.fit_transform(X_train)  #对训练集数据进行特征抽取
    X_test=transfer.transform(X_test)        #对测试集数据直接进行转换即可,他用的是训练集的数据

    #4、朴素贝叶斯算法的预估器流程
    estimator=MultinomialNB(alpha=1.2)               #默认的alpha就是1.0,按照默认的就可以了
    estimator.fit(X_train,y_train)
    #5、模型评估
    acc=estimator.score(X_test,y_test)
    print("模型分类正确率为:\n",acc*100)

def DT_iris_demo():
    """
    用决策树算法对鸢尾花进行分类
    :return:
    """
    # 1、获取数据
    iris = load_iris()

    # 2、划分数据集
    X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=20)  # 里面传入特征值和目标值,后面的参数可以传也可以不传

    #决策树这一步可以没有
    # 3、特征工程--标准化(经过下面步骤训练集和测试集的特征都抽取好了)-----特征工程这个地方是可以有自己的想法去进行创造的。这是区别的地方
    transfer = StandardScaler()                   #这一步可以没有
    X_train = transfer.fit_transform(X_train)  # 对训练集数据进行特征抽取
    X_test = transfer.transform(X_test)        # 对测试集数据直接进行转换即可,他用的是训练集的数据

    # 4、决策树算法的预估器流程
    estimator = DecisionTreeClassifier(criterion="entropy")  #这里我们设定使用信息增益作为决策树划分的依据
    estimator.fit(X_train, y_train)
    # 5、模型评估
    acc = estimator.score(X_test, y_test)
    print("DT模型分类正确率为:\n", acc * 100)

    #决策树的可视化
    export_graphviz(estimator, out_file="iris_tree.dot",feature_names=iris.feature_names)
    #直接运行在该目录下直接生成了一个iris_tree.dot文本文件(自己可以查看)---iris这个数据集本身就有一个feature_names;如果没有要用列表的形式自己填入
    #这个文本文件看不懂,直接生成树---1、网址:webgraphviz.com   2、将iris_tree.dot文件粘贴到框里  3、点击生成树按钮(那个feature_names必须填写否则你看不懂)
    return None

def DT_titanic_demo():
    """
    用决策树算法对泰坦尼克号幸存者进行预测
    :return:
    """
    #1、获取数据
    titanic=pd.read_csv("./titanic.csv")  #(1313, 11)---如果不确定可以检验是否存在缺失值(可以从描述里面看,如果有缺失值,要剔除缺失值)

    #2、数据处理--可以剔除里面的无用特征、eg:row.names(筛选一下特征值和目标值)
    x=titanic[['pclass','age','sex']]     #从dataframe中选择有用的几列信息作为特征值
    y=titanic['survived']                 #目标值---padas的数据类型中series和dataframe都可以挑选出其values和index

    #2.1 缺失值处理方法
    #方法1、可以使用dropna()对缺失值进行删除
    #方法2、可以对使用fillna()对缺失值进行填充(可以使用平均值、众数、中位数对缺失值进行填充操作)
    x["age"].fillna(value=x["age"].mean(),inplace=True)  #先选出age这一列,然后填充的值是age这一列的平均值;然后inplace是直接对age这一列进行更改了
    #2.2、转化为字典---将dataframe转化为字典
    x=x.to_dict(orient="records")   #dataframe和字典之间是可以想换转换的;orient是转换的格式;这种格式比较好看,记住这个格式;然后将其存放到list当中

    #3、划分数据集
    X_train, X_test, y_train, y_test=train_test_split(x,y,random_state=6)

    #字典特征抽取---对类别使用one-hot编码(之后一个特征会变成多个特征)
    transfer=DictVectorizer()
    X_train=transfer.fit_transform(X_train)
    X_test=transfer.transform(X_test)

    # 4、决策树算法的预估器流程---这些参数都是可以使用网格搜索去进行调整的
    estimator = DecisionTreeClassifier(criterion="entropy",max_depth=6)  # 这里我们设定使用信息增益作为决策树划分的依据
    estimator.fit(X_train, y_train)
    # 5、模型评估
    acc = estimator.score(X_test, y_test)
    print("DT模型分类正确率为:\n", acc * 100)

    # 决策树的可视化----字典特征抽取中有一个函数可以直接抽取transfer中的特征名字
    export_graphviz(estimator, out_file="DT_titanic.dot", feature_names=transfer.get_feature_names())
    return None

def RF_titanic_demo():
    """
    用随机森林算法对泰坦尼克号幸存者进行预测
    :return:
    """
    # 1、获取数据
    titanic = pd.read_csv("./titanic.csv")  # (1313, 11)---如果不确定可以检验是否存在缺失值(可以从描述里面看,如果有缺失值,要剔除缺失值)

    # 2、数据处理--可以剔除里面的无用特征、eg:row.names(筛选一下特征值和目标值)
    x = titanic[['pclass', 'age', 'sex']]  # 从dataframe中选择有用的几列信息作为特征值
    y = titanic['survived']  # 目标值---padas的数据类型中series和dataframe都可以挑选出其values和index

    # 2.1 缺失值处理方法
    # 方法1、可以使用dropna()对缺失值进行删除
    # 方法2、可以对使用fillna()对缺失值进行填充(可以使用平均值、众数、中位数对缺失值进行填充操作)
    x["age"].fillna(value=x["age"].mean(), inplace=True)  # 先选出age这一列,然后填充的值是age这一列的平均值;然后inplace是直接对age这一列进行更改了
    # 2.2、转化为字典---将dataframe转化为字典
    x = x.to_dict(orient="records")  # dataframe和字典之间是可以想换转换的;orient是转换的格式;这种格式比较好看,记住这个格式;然后将其存放到list当中

    # 3、划分数据集
    X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=6)

    # 字典特征抽取---对类别使用one-hot编码(之后一个特征会变成多个特征)
    transfer = DictVectorizer()
    X_train = transfer.fit_transform(X_train)
    X_test = transfer.transform(X_test)

    # 4、随机森林算法的预估器流程---这些参数都是可以使用网格搜索去进行调整的(里面参数就不填了,打算使用网格搜索进行调参)
    estimator = RandomForestClassifier()
    param_dict = {"n_estimators": [100,120,200,300,500,800,1000],"max_depth":[5,8,15,25,30]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)   #因为数据量大,树的数量比较多,将cv设置少一点
    estimator.fit(X_train, y_train)

    # 5、模型评估
    acc = estimator.score(X_test, y_test)
    print("RF模型分类正确率为:\n", acc * 100)

    print("最佳参数:\n", estimator.best_params_)
    # 最佳结果:best_score_
    print("最佳结果:\n", estimator.best_score_)  # 这里的最佳结果指的是进行10交叉验证后的10次平均值的最后结果
    # 最佳估计器:best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)

    # # 决策树的可视化----字典特征抽取中有一个函数可以直接抽取transfer中的特征名字
    # export_graphviz(estimator, out_file="DT_titanic.dot", feature_names=transfer.get_feature_names())
    return None


if __name__ == '__main__':
    #代码1:使用K-近邻算法(KNN)对鸢尾花数据集进行分类
    # KNN_iris()
    #代码2:用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    # KNN_iris_gscv()
    #代码3:用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
    # facebook_demo()
    #代码4:用朴素贝叶斯算法对新闻进行分类
    # naivebyes_new_demo()
    # 代码5:用决策树算法对鸢尾花进行分类
    # DT_iris_demo()
    # 代码6:用决策树算法对泰坦尼克号幸存者进行预测---决策树容易出现过拟合现象
    # DT_titanic_demo()
    # 代码7:用随机森林算法对泰坦尼克号幸存者进行预测
    RF_titanic_demo()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值