1.Scikit-learn包含内容 Classification分类Regression回归Clustering聚类Dimensionality reduction降维Model selection模型选择Preprocessing特征工程 2.scikit-learn数据集API介绍 sklearn.datasets.load_*():获取小规模数据集,数据包含在datasets里例:sklearn.datasets.load_iris():加载并返回鸢尾花数据集sklearn.datasets.fetch_*(data_home=None):获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是**~/scikit_learn_data/** 3.sklearn数据集的使用 load和fetch返回的数据类型datasets.base.Bunch(字典格式)data:特征数据数组,是[n_samples * n_features]的二维numpy.ndarry数组target:标签数组,是n_samples的一维numpy.ndarry数组DESCR:数据描述feature_names:特征名,新闻数据,手写数字、回归数据集没有target_names:标签名例:from sklearn.datasets import load_irisdef datasets_demo(): """ sklearn数据集使用 :return: """ # 获取数据集 iris = load_iris() print("鸢尾花数据集:\n", iris) print("查看数据集描述:\n", iris["DESCR"]) # 数据集的描述信息 print("查看特征值的名字:\n", iris.feature_names) print("查看特征值:\n", iris.data, iris.data.shape) # shape:(150,4) return Noneif __name__ == "__main__": datasets_demo() 查看特征值的名字: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 4.数据集划分 sklearn.model_selection.train_test_split(arrays,*options) x 数据集的特征值y 数据集的标签值test_size测试集的大小,一般为floatrandom_state随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同return训练集特征值,测试集特征值,训练集目标值,测试集目标值 5.特征提取(将任意数据(如文本或图像)转化为可用于机器学习的数字特征) 字典特征提取文本特征提取图像特征提取 (1)字典特征提取作用:对字典数据进行特征值化sklearn.feature_extraction.DictVectorizer(sparse=True, …)DictVectorizer.fit_transform(X), X:字典或者包含字典的迭代器返回值,返回sparse矩阵DictVectorizer.inverse_transform(X), X:array数组或者sparse矩阵 返回值:转换之前数据格式DictVectorizer.get_feature_names():返回类别名称例:from sklearn.feature_extraction import DictVectorizerdef dict_demo(): """ 字典特征抽取 :return: """ data = [{'city':'北京', 'temperature':100}, {'city':'上海', 'temperature':60}, {'city':'深圳', 'temperature':30}] # 1、实例化一个转换器类 #transfer = DictVectorizer() # 返回sparse矩阵 transfer = DictVectorizer(sparse=False) # 2、调用fit_transform() data_new = transfer.fit_transform(data) print("data_new:\n", data_new) # 转化后的 print("特征名字:\n", transfer.get_feature_names()) return Noneif __name__ == "__main__": dict_demo()输出:data_new: [[ 0. 1. 0. 100.] [ 1. 0. 0. 60.] [ 0. 0. 1. 30.]] 特征名字: ['city=上海', 'city=北京', 'city=深圳', 'temperature'] (2)文本特征提取 单词作为特征 作用:对文本数据进行特征值化sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):返回词频矩阵CountVectorizer.fit_transform(X),X:文本或者包含文本字符串的可迭代对象,返回值:返回sparse矩阵CountVectorizer.inverse_transform(X),X:array数组或者sparse矩阵,返回值:转换之前数据格CountVectorizer.get_feature_names():返回值:单词列表①英文文本分词from sklearn.feature_extraction.text import CountVectorizerdef count_demo(): """ 文本特征抽取:CountVectorizer :return: """ data = ['life is short,i like like python', 'life is too long,i dislike python'] # 1、实例化一个转换器类 transfer = CountVectorizer() # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) # toarray转换为二维数组 print("特征名字:\n", transfer.get_feature_names()) return Noneif __name__ == "__main__": count_demo()输出:data_new: [[0 1 1 2 0 1 1 0] [1 1 1 0 1 1 0 1]]特征名字: ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']②停用词:stop_words=[]from sklearn.feature_extraction.text import CountVectorizerdef count_demo(): """ 文本特征抽取:CountVectorizer :return: """ data = ['life is short,i like like python', 'life is too long,i dislike python'] # 1、实例化一个转换器类 transfer = CountVectorizer(stop_words=['is', 'too']) # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) # toarray转换为二维数组 print("特征名字:\n", transfer.get_feature_names()) return Noneif __name__ == "__main__": count_demo()输出:data_new: [[0 1 2 0 1 1] [1 1 0 1 1 0]]特征名字: ['dislike', 'life', 'like', 'long', 'python', 'short']③中文分本分词例1:from sklearn.feature_extraction.text import CountVectorizerdef count_demo(): """ 文本特征抽取:CountVectorizer :return: """ data = ['我 爱 北京 天安门', '天安门 上 太阳 升'] # 1、实例化一个转换器类 transfer = CountVectorizer() # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) # toarray转换为二维数组 print("特征名字:\n", transfer.get_feature_names()) return Noneif __name__ == "__main__": count_demo()输出:data_new: [[1 1 0] [0 1 1]]特征名字: ['北京', '天安门', '太阳']例2:from sklearn.feature_extraction.text import CountVectorizerimport jiebadef count_chinese_demo2(): """ 中文文本特征抽取,自动分词 :return: """ data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。', '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。', '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。'] data_new = [] for sent in data: data_new.append(cut_word(sent)) print(data_new) # 1、实例化一个转换器类 transfer = CountVectorizer() # 2、调用fit_transform data_final = transfer.fit_transform(data_new) print("data_final:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return Nonedef cut_word(text): """ 进行中文分词:“我爱北京天安门” -> "我 爱 北京 天安门" :param text: :return: """ return ' '.join(jieba.cut(text)) if __name__ == "__main__": count_chinese_demo2() #print(cut_word('我爱北京天安门'))输出:['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']data_final: [[2 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1 0] [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0 1] [1 1 0 0 4 2 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0 0]]特征名字: ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某件事', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']注:关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章中出现很少④Tf-idf文本特征提取(这种方法是计算特征词的重要程度的)Tf-idf的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来区分Tf-idf作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度TF-IDF:衡量重要程度TF:词频IDF:逆向文档频率,可以由总文件数目 / 包含该词语之文件的数目,再将得到的商取以10为底的对数得到例:from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizerimport jiebadef cut_word(text): """ 进行中文分词:“我爱北京天安门” -> "我 爱 北京 天安门" :param text: :return: """ return ' '.join(jieba.cut(text))def tfidf_demo(): """ 用TF-IDF的方法进行文本特征抽取 :return: """ data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。', '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。', '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。'] data_new = [] for sent in data: data_new.append(cut_word(sent)) print(data_new) # 1、实例化一个转换器类 transfer = TfidfVectorizer() # 2、调用fit_transform data_final = transfer.fit_transform(data_new) print("data_final:\n", data_final.toarray()) print("特征名字:\n", transfer.get_feature_names()) return Noneif __name__ == "__main__": tfidf_demo() #print(cut_word('我爱北京天安门')输出:['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']data_final: [[0.30847454 0. 0.20280347 0. 0. 0. 0.40560694 0. 0. 0. 0. 0. 0.20280347 0. 0.20280347 0. 0. 0. 0. 0.20280347 0.20280347 0. 0.40560694 0. 0.20280347 0. 0.40560694 0.20280347 0. 0. 0. 0.20280347 0.20280347 0. 0. 0.20280347 0. ] [0. 0. 0. 0.2410822 0. 0. 0. 0.2410822 0.2410822 0.2410822 0. 0. 0. 0. 0. 0. 0. 0.2410822 0.55004769 0. 0. 0. 0. 0.2410822 0. 0. 0. 0. 0.48216441 0. 0. 0. 0. 0. 0.2410822 0. 0.2410822 ] [0.12826533 0.16865349 0. 0. 0.67461397 0.33730698 0. 0. 0. 0. 0.16865349 0.16865349 0. 0.16865349 0. 0.16865349 0.16865349 0. 0.12826533 0. 0. 0.16865349 0. 0. 0. 0.16865349 0. 0. 0. 0.33730698 0.16865349 0. 0. 0.16865349 0. 0. 0. ]]特征名字: ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某件事', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样'] 特征预处理 (1)归一化:Sklearn.preprocessing.MinMaxScaler(feature_range(0,1)…)MinMaxScaler.fit_transform(X),X:numpy array格式的数据[n_samples,n_features],返回值:转换后的形式相同的array例:import pandas as pdfrom sklearn.preprocessing import MinMaxScalerdef minmax_demo(): """ 归一化 :return: """ # 1、获取数据 data = pd.read_csv("datingTestSet2.txt", sep='\t') data = data.iloc[:, :3] print("data:\n", data) # 2、实例化一个转换器类 transform = MinMaxScaler() #transform = MinMaxScaler(feature_range=[2,3]) # 3、调用fit_transform data_new = transform.fit_transform(data) print("data_new:\n", data_new) return Noneif __name__ == "__main__": minmax_demo()注:最大值与最小值非常容易受到异常值影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景 (2)标准化:(通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内)(受异常值影响较小,在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景)sklearn.perprocessing.StandradScaler()处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1StandardScaler.fit_transform(X),X;numpy array格式的数据[n_samples,n_features],返回值:转化后的形状相同的array例子:from sklearn.preprocessing import MinMaxScaler, StandardScalerdef stand_demo(): """ 标准化 :return: """ # 1、获取数据 data = pd.read_csv("datingTestSet2.txt", sep='\t') data = data.iloc[:, :3] print("data:\n", data) # 2、实例化一个转换器类 transform = StandardScaler() #transform = StandardScaler(feature_range=[2,3]) # 3、调用fit_transform data_new = transform.fit_transform(data) print("data_new:\n", data_new) return Noneif __name__ == "__main__": stand_demo() 7.特征降维(1)降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程(2)方式:特征选择①Filter过滤式:主要探究特征本身特点、特征与特征和目标值之间关联a.方差选择法:低方差特征过滤(低方差代表那一列数据差别不大,所以不是主要特征)b. 相关系数:特征与特征之间的相关程度②Embedded嵌入式:算法自动选择特征(特征与目标值之间的关联)A.决策树:信息熵、信息增益B.正则化:L1、L2C.深度学习:卷积等 过滤式例:sklearn.feature_selection.VArianceThreshold(threshold=0.0)删除所有低方差特征Variance.fit_transform(X),X:numpy array格式的数据[m_sample,n_features],返回值:训练集差异低于threadshold的特征将被删除。默认值是保留非零方差特征,即删除所有样本中具有相同值的特征from sklearn.feature_selection import VarianceThresholddef variance_demo(): """ 低方差特征过滤 :return: """ # 1、获取数据 data = pd.read_csv('factor_returns.csv') print('data:\n', data) data = data.iloc[:,1:-2] print('data:\n', data) # 2、实例化一个转换器类 #transform = VarianceThreshold() transform = VarianceThreshold(threshold=10) # 3、调用fit_transform data_new = transform.fit_transform(data) print("data_new\n", data_new, data_new.shape) return Noneif __name__ == "__main__": variance_demo() 相关系数:(输出的结果相关系数看前面那个)from sklearn.feature_selection import VarianceThresholdfrom scipy.stats import pearsonrdef variance_demo(): """ 低方差特征过滤 :return: """ # 1、获取数据 data = pd.read_csv('factor_returns.csv') print('data:\n', data) data = data.iloc[:,1:-2] print('data:\n', data) # 2、实例化一个转换器类 #transform = VarianceThreshold() transform = VarianceThreshold(threshold=10) # 3、调用fit_transform data_new = transform.fit_transform(data) print("data_new\n", data_new, data_new.shape) # 计算两个变量之间的相关系数 r = pearsonr(data["pe_ratio"],data["pb_ratio"]) print("相关系数:\n", r) return Noneif __name__ == "__main__": variance_demo() 注:如果特征与特征相关性很高:选取其中一个加权求和主成分分析 主成分分析(高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量)sklearn.decomposition.PCA(n_components=None)将数据分解为较低维度空间n_components:小数:表示保留百分之多少的信息整数:减少到多少特征PCA.fit_transform(X),X:numpy array格式的数据[N_samples, n_features],返回值:转换后指定维度的array例:from sklearn.decomposition import PCAdef pca_demo(): """ PCA降维 :return: """ data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]] # 1、实例化一个转换器类 transform = PCA(n_components=2) # 4个特征降到2个特征 # 2、调用fit_transform data_new = transform.fit_transform(data) print("data_new\n", data_new) transform2 = PCA(n_components=0.95) # 保留95%的信息 data_new2 = transform2.fit_transform(data) print("data_new2\n", data_new2) return Noneif __name__ == "__main__": pca_demo() 案例:探究用户对物品类别的喜好细分降维1.获取数据(pd.read_csv())2.合并表(pd.merge(表1,表2,on=['要连接的列','要连接的列']))3.找表之间的关系(交叉表)(pd.crosstab(表['列'1],表['列2']))4.PCA降维(引入,实例化,调用fit_transform) 8.sklearn转换器和估计器 8.1.1 转换器 (1)实例化一个转换器类 (2)调用fit_transform()注:fit_transfrom为fit和transfrom的合成方法Fit 计算 即计算每一列的均值和标准差Transform 转换 8.1.2 估计器(estimator)(1)用于分类的估计器: sklearn.neighbors K近邻算法 sklearn.native_bayes 贝叶斯 sklearn.linear_model.LogisticRegression 逻辑回归 sklearn.tree 决策树与随机森林(2) 用于回归的估计器 sklearn.linear_model.LinearRegression 线性回归 sklearn.linear_model.Ridge 岭回归(3) 用于无监督学习的估计器 sklearn.cluster.Kmeans 聚类步骤:1.实例化一个estimator 2.estimator.fit(x_train,y_train)计算---------调用完毕,模型生成 3.模型评估 1) 直接比对真实值和预测值:y_predict =estimator.predict(x_test) 2) 计算准确率: accuracy = estimator.score(x_test,y_test) 8.2.1 KNN算法APIsklearn.neighbor.KNeighborsClassifier(n_neighbors=5, algorithm='auto')n_neighbors:int型,k_neighbors查询默认使用的邻居数algorithm:{‘auto’,‘ball_tree’,‘kd_tree’}之一 案例:鸢尾花种类预测步骤:1.获取数据 2.数据集划分 3.特征工程:标准化 4.KNN预估器流程 5.模型评估from sklearn.datasets import load_iris # 获取数据集from sklearn.model_selection import train_test_split # 划分数据集from sklearn.preprocessing import StandardScaler # 标准化from sklearn.neighbors import KNeighborsClassifier # KNN算法分类 def knn_iris(): """ 用KNN算法对鸢尾花进行分类 :return: """ # 1、获取数据 iris = load_iris() # 2、划分数据集 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6) # 3、特征工程:标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) # 训练集标准化 x_test = transfer.transform(x_test) # 测试集标准化 注: x_test直接用transform,因为要对训练集和测试集做相同的处理,此处不需再计算,而直接使用训练集的测试结果 # 4、KNN算法预估器 estimator = KNeighborsClassifier(n_neighbors=3) estimator.fit(x_train, y_train) # 5、模型评估 # 方法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) return Noneif __name__ == "__main__": knn_iris() 9.模型选择与调优 (1)交叉验证(cross validation) (2)超参数搜索-----网格搜索(GridSearch) 9.1.1 模型选择与调优APIsklearn.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)对估计器的指定参数进行详尽搜索estimator:估计器对象param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]} 注意是字典格式cv:指定几折交叉验证fit():输入训练数据score():准确率结果分析:最佳参数:best_params_最佳结果:best_score_最佳估计器:best_estimator_交叉验证结果:cv_results_ 鸢尾花案例增加K值调优(要在评估器后面加入调优)from sklearn.datasets import load_iris # 获取数据集from sklearn.model_selection import train_test_split # 划分数据集from sklearn.preprocessing import StandardScaler # 标准化from sklearn.neighbors import KNeighborsClassifier # KNN算法分类from sklearn.model_selection import GridSearchCVdef knn_iris_gscv(): """ 用KNN算法对鸢尾花进行分类 添加网格搜索和交叉验证 :return: """ # 1、获取数据 iris = load_iris() # 2、划分数据集 x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6) # 3、特征工程:标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) # 训练集标准化 x_test = transfer.transform(x_test) # 测试集标准化 # 4、KNN算法预估器 estimator = KNeighborsClassifier() # 加入网格搜索与交叉验证 # 参数准备 param_dict = {"n_neighbors": [1,3,5,7,9,11]} estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10) # 10折,数据量不大,可以多折 estimator.fit(x_train, y_train) # 5、模型评估 # 方法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("准确率:", score) # 查看最佳参数:best_params_ print("最佳参数:", estimator.best_params_) # 最佳结果:best_score_ print("最佳结果:", estimator.best_score_) # 最佳估计器:best_estimator_ print("最佳估计器:", estimator.best_estimator_) # 交叉验证结果:cv_results_ print("交叉验证结果:", estimator.cv_results_) return Noneif __name__ == "__main__": knn_iris_gscv() 10.集成学习方法之随机森林 集成学习方法通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各种独立地学习和做出预测。这些预测最后结合成组合预测,因此优于任何一个单分类做出的预测 10.1.1 什么是随机森林 在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别数输出的类别的众数而定例:如果训练了5棵树,5棵树的结果是True,1棵树的结果是False,那么最终结果就是True 10.1.2 随机森林原理过程 两个随机: 训练集随机: BoostStrap,N个样本中随机有放回抽样 特征值随机:从M个特征中随机抽取m个特征,M>>m 问题:为什么要采用BootStrap抽样 1. 为什么要随机抽样训练集? 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的为什么要有放回地抽样? 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每颗树都是“有偏的”,都是绝对“片面的”,也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树的投票表决 10.1.3 随机森林分类器APIsklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None, /bootstrap=True, random_state=None, min_samples_split=2)n_estimators:integer,optional(default=10)森林里的树木数量,可以用网格搜索criteria:string,可选(default=‘gini’),分割特征的测量方法max_depth:integer或None,可选(默认无),树的最大深度5,8,15,25,30 可以用网格搜索max_teatures=‘auto’,每个决策树的最大特征数量if ‘auto’ ,then max_features = sqrt(n_features)if ‘sqrt’ ,then max_features = sqrt(n_features)if ‘log2’ ,then max_features = log2(n_features)if None,then max_features = n_featuresbooststrap:boolean,optional(default=True)是否在构建树时使用放回抽样min_samples_split:节点划分最少样本数min_samples_leaf:叶子节点的最小样本数超参数:n_estimator,max_depth,min_samples_split,min_samples_leaf10.1.4 随机森林案例预测:from sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import GridSearchCVestimator = 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) # 10折,数据量不大,可以多折estimator.fit(x_train, y_train) # 5、模型评估# 方法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("准确率:", score)# 查看最佳参数:best_params_print("最佳参数:", estimator.best_params_)# 最佳结果:best_score_print("最佳结果:", estimator.best_score_)# 最佳估计器:best_estimator_print("最佳估计器:", estimator.best_estimator_)# 交叉验证结果:cv_results_print("交叉验证结果:", estimator.cv_results_) 10.1.5 随机森林算法总结 (1)在当前所有算法中,具有极好的准确率 (2)能够有效地运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维 (3)能够评估各个特征在分类问题上的重要性 线性回归:1)线性回归是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式特点: 只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归 2)损失函数:最小二乘法 (均方误差)3)优化算法:① 正规方程:直接求解W ② 梯度下降:试错,改进4)线性回归API:sklearn.linear_model.LinearRegression(fit_intercept=True)fit_intercept:是否计算偏置LinearRegression.coef_:回归系数LinearRegression.intercept_:偏置5)梯度下降API:sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate='invscaling', eta0=0.01)SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型loss:损失类型loss=“squared_loss”:普通最小二乘法fit_intercept:是否计算偏置learning_rate:string,optional学习率填充‘constant’:eta=eta0‘optimal’:eta=1.0 / (alpha*(t+t0)) [default]‘invscaling’:eta=eta0 / pow(t, power_t)SGDRegression.coef_:回归系数SGDRegression.intercept_:偏置 波士顿房价预测例:1)流程:获取数据集划分数据集特征工程:无量纲化-标准化预估器流程:fit() -> 模型,coef_ intercept_模型评估2)回归性能评估 ----均方误差(MSE)sklearn.metrics.mean_squared_error(y_ture, y_pred)均方误差回归损失y_true:真实值y_pred:预测值return:浮点数结果3)代码from sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LinearRegression, SGDRegressorfrom sklearn.metrics import mean_squared_errordef linner1(): """ 正规方程的优化方法 :return: """ # 1)获取数据 boston = load_boston() # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22) # 3)标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)预估器 estimator = LinearRegression() estimator.fit(x_train, y_train) # 5)得出模型 print("正规方程权重系数为:\n", estimator.coef_) print("正规方程偏置为:\n", estimator.intercept_) # 6)模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n", y_predict) error = mean_squared_error(y_test, y_predict) print("正规方程-均分误差为:\n", error) return None def linner2(): """ 梯度下降的优化方法 :return: """ # 1)获取数据 boston = load_boston() print("特征数量:\n", boston.data.shape) # 几个特征对应几个权重系数 # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22) # 3)标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)预估器 estimator = SGDRegressor(learning_rate="constant", eta0=0.001, max_iter=10000) estimator.fit(x_train, y_train) # 5)得出模型 print("梯度下降权重系数为:\n", estimator.coef_) print("梯度下降偏置为:\n", estimator.intercept_) # 6)模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n", y_predict) error = mean_squared_error(y_test, y_predict) print("梯度下降-均分误差为:\n", error) return Noneif __name__ == '__main__': linner1() linner2() 4)对比:梯度下降正规方程需要选择学习率不需要需要迭代求解一次运算得出特征数量较大可以使用需要计算方程,时间复杂度O(n3) 5)梯度下降的扩展:GD、SGD、SAG ① GD: 梯度下降,原始的梯度下降法需要计算所有样本的值才能够得出梯度,计算量大,所以后面才会有一系列改进 ② SGD: 随机梯度下降是一个优化方法。它在一次迭代时只考虑一个训练样本 优点: 高效、容易实现 缺点:需要许多超参数:比如正则项参数、迭代数 对于特征标准化是敏感的 ③ SAG 随机平均梯度法,由于收敛的速度太慢,有人提出SAG等基于梯度下降的算法 Scikit-learn:岭回归、逻辑回归等当中都会有SAG优化 欠拟合过拟合1)欠拟合:在训练集和测试集表现都不好原因:学习到数据的特征过少解决办法:增加数据的特征数量2)过拟合:在训练集表现好,但在测试集表现不好原因:学习到的特征过多,存在一些嘈杂特征,模型过于复杂解决办法:正则化 正则化:1)L1正则化:使其中一些W(权重)的值直接为0,删除这个特征的影响采用L1正则化的线性回归模型是LASSO回归2)L2正则化:使其中一些W(权重)的值都很小,都接近于0,削弱某个特征的影响采用L2正则化的线性回归模型是Ridge回归加入L2正则化后的损失函数:损失函数+惩罚项优点:越小的参数说明模型越简单,越简单的模型也不容易产生过拟合现象 线性回归的改进---岭回归1).带有L2正则化的线性回归----岭回归2).APIsklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, solver='auto', normalize=False)alpha:正则化力度,取值范围:0-1,1-10solver:会根据数据自动选择优化方法sag:如果数据集、特征都较大,选择该随机梯度下降优化normalize:数据是否进行标准化normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据Ridge.coef_:回归权重Ridge.intercept_:回归偏置3)例:from sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LinearRegression, SGDRegressor, Ridgefrom sklearn.metrics import mean_squared_errordef linner1(): """ 正规方程的优化方法 :return: """ # 1)获取数据 boston = load_boston() # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22) # 3)标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)预估器 estimator = LinearRegression() estimator.fit(x_train, y_train) # 5)得出模型 print("正规方程权重系数为:\n", estimator.coef_) print("正规方程偏置为:\n", estimator.intercept_) # 6)模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n", y_predict) error = mean_squared_error(y_test, y_predict) print("正规方程-均分误差为:\n", error) return None def linner2(): """ 梯度下降的优化方法 :return: """ # 1)获取数据 boston = load_boston() print("特征数量:\n", boston.data.shape) # 几个特征对应几个权重系数 # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22) # 3)标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)预估器 estimator = SGDRegressor(learning_rate="constant", eta0=0.001, max_iter=10000) estimator.fit(x_train, y_train) # 5)得出模型 print("梯度下降权重系数为:\n", estimator.coef_) print("梯度下降偏置为:\n", estimator.intercept_) # 6)模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n", y_predict) error = mean_squared_error(y_test, y_predict) print("梯度下降-均分误差为:\n", error) return None def linner3(): """ 岭回归 :return: """ # 1)获取数据 boston = load_boston() print("特征数量:\n", boston.data.shape) # 几个特征对应几个权重系数 # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22) # 3)标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)预估器 estimator = Ridge(alpha=0.5, max_iter=10000) # 可默认参数 estimator.fit(x_train, y_train) # 5)得出模型 print("岭回归-权重系数为:\n", estimator.coef_) print("岭回归-下降偏置为:\n", estimator.intercept_) # 6)模型评估 y_predict = estimator.predict(x_test) print("预测房价:\n", y_predict) error = mean_squared_error(y_test, y_predict) print("岭回归-均分误差为:\n", error) return Noneif __name__ == '__main__': linner1() linner2() linner3() 逻辑回归:(解决二分类)1).线性回归的输出就是逻辑回归的输入,将输出输入到sigmoid函数中,就将输出结果映射到[0,1]中,设置阈值,就能解决二分类问题2).APIsklearn.linear_model.LogisticRefression(solver='liblinear', penalty='l2, C=1.0)penalty:正则化种类C:正则化力度solver:优化求解方式(默认开源的liblinear库实现)3).例:癌症分类预测-良/恶性乳腺癌肿瘤预测流程分析获取数据数据处理:处理缺失值数据集划分特征工程:无量纲化处理——标准化逻辑回归预估器模型评估import pandas as pdimport numpy as np# 1、读取数据path = "cid:link_0"column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']data = pd.read_csv(path, names=column_name) #699 rows × 11 columns# 2、缺失值处理# 1)替换-》np.nandata = data.replace(to_replace="?", value=np.nan)# 2)删除缺失样本data.dropna(inplace=True) #683 rows × 11 columns# 3、划分数据集from sklearn.model_selection import train_test_split# 筛选特征值和目标值x = data.iloc[:, 1:-1]y = data["Class"]x_train, x_test, y_train, y_test = train_test_split(x, y)# 4、标准化from sklearn.preprocessing import StandardScalertransfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)from sklearn.linear_model import LogisticRegression# 5、预估器流程estimator = LogisticRegression()estimator.fit(x_train, y_train)# 逻辑回归的模型参数:回归系数和偏置estimator.coef_ # 权重estimator.intercept_ # 偏置# 6、模型评估# 方法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) 分类评估方法:1)精确率与召回率精确率:预测结果为正例样本中真实为正例的比例召回率:真实为正例的样本中预测结果为正例的比例F1-score:反映了模型的稳健性2)API:sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None)y_true:真实目标值y_pred:估计器预测目标值labels:指定类别对应的数字target_names:目标类别名称return:每个类别精确率与召回率# 查看精确率、召回率、F1-scorefrom sklearn.metrics import classification_reportreport = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]) 3)衡量样本不均衡下的评估ROC曲线与AUC指标TPR就是召回率 4)AUC计算APIfrom sklearn.metrics import roc_auc_scoreroc_auc_score(y_true, y_score)y_true:每个样本的真实类别,必须为0(反例)和1(正例)y_score:预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值# y_true:每个样本的真实类别,必须为0(反例),1(正例)标记# 将y_test 转换成 0 1y_true = np.where(y_test > 3, 1, 0) from sklearn.metrics import roc_auc_scoreroc_auc_score(y_true, y_predict) 5)总结:AUC只能用来评价二分类AUC非常适合评价样本在不平衡中的分类器性能 6)模型保存和加载APIimport joblib保存:joblib.dump(rf, ‘test.pkl’)加载:estimator = joblib.load(‘test.pkl’) 无监督学习:聚类:K-means降维:PCA 1)K-means APIsklearn.cluster.KMeans(n_cluster=8, init='k-means++')n_clusters:开始聚类中心数量init:初始化方法,默认为‘k-means++’labels_:默认标记的类型,可以和真实值比较(不是值比较)from sklearn.cluster import KMeansestimator = KMeans(n_clusters=3)estimator.fit(data_new)y_predict = estimator.predict(data_new)2)K-means性能评估指标①轮廓系数②轮廓系数值分析③结论如果bi>>ai:趋近于1效果越好,bi<<ai:趋近于-1,效果不好。轮廓系数的值是介于[-1,1],越趋近于1代表内聚度和分离度都相对较优 ④轮廓系数APIsklearn.metrics.silhouette_score(X, labels)计算所有样本的平均轮廓系数X:特征值labels:被聚类标记的目标值from sklearn.metrics import silhouette_scoresilhouette_score(data_new, y_predict) ⑤K-means总结:特点分析:采用迭代式算法,直观易懂并且非常实用缺点:容易收敛到局部最优解(多次聚类)注:聚类一般在分类之前
narrow22/7
发表于2024-03-08 21:46:53
2024-03-08 21:46:53
最后回复
38