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()
day02-机器学习打卡
最新推荐文章于 2024-10-18 00:00:00 发布