本文共 12825 字,大约阅读时间需要 42 分钟。
1. 将特征缩放, 提到精度 scale()函数时对矩阵每一列进行操作, 使其均值为0, 方差为1 StandardScaler().fit(X\_train)返回一个StandardScale对象, 里面封装了对X_train的标准化操作, 当调用transform函数时, 就会返回和scale()函数一样的结果 fit(X_train)函数估算每个特征的平均值和标准差, 所以是按列的2. 分类 sklearn.moudel.selection.train_test_split(X, y, test_size=0.3, random_state=0)3. K-CV KFold(划分的个数, shuffle=是否打乱数据, 一般为False, random_state=None) 其实就是一个随机的下标生成器之类的4. 在逻辑回归中的predict函数时依赖于predict_proba函数, 其实这个predict_proba就是我们求出的目标函数, 该函数的结果是在0-1之间的, 因为sigmoid函数的值域, 我们称返回的结果为概率,我们带入一个数, 返回的一个概率值, 而predict_proba函数还会使用1减去该值计算出另一个的概率, 对于我们来说, 我们只需要抓住一个值, 判断他与临界点的大小即可, 默认为0.5; 而对于线性回归,就不需要那么麻烦了, 得出来的目标函数就是结果了5. 在逻辑回归中, 混淆矩阵是我们常用的, 在confusion_matrix(y_true, y_test)中的y_test要么是我们求出的值, 要么是bool类型的矩阵, true表示肯定回答, false表示否定回答6. SMOTE对象的fit_sample(X_train, y_train)函数中X与y是我们train_test_split之后剩下的所有数据, 没有进行KFold, 因为数据还没有处理好, 该函数会自动根据SMOTE算法生成和数量较多的标签值的一样的数量, 所以返回的结果比我们原始传进来的要多, 但是返回的一个矩阵7. StratifiedKFold需要y标签, 根据y标签分类的比例进行划分8. feature_selection模块中的SelectKBest类对象, 他的.fit_trainsform方法用来返回有用的特征, K表示特征放回的特征个数, SelectKBest(选择特征的算法(chi[卡方], f_classif[用于分类], f_regression[用于线性]), k=返回的特征的个数), 返回的是新的特征X, 而selector.pvalue_属性保存的矩阵是一开始传入的特征的score, 该对象就是通过该score选择特征的
1. df的iloc和loc属性, loc是相对于原始数据的下标, iloc是相对于当期的数据2. pd.value_counts(df['col_name'])返回一个Series的总结结果3. pandas也可以画图, series_obj.plot(kind='bar')4. df.列名5. df.describe()返回DataFrame对象, 描述了mean, max, min, count等实用的信息
step1. 数据加载和预处理 step2. 定义分类器, 比如: lr_model = LogisticRegression() step3. 使用训练集训练模型 : lr_model.fit(X,Y) step4. 使用训练好的模型进行预测: y_pred = lr_model.predict(X_test) step5. 对模型进行性能评估:lr_model.score(X_test, y_test)
copy过来的第一步、从原始数据里面做特征的抽取,形成宽表。比如日志信息。第二步、噪音过滤,如果数据中存在缺失值(数据)或者异常值(数据)等要做噪声处理。第三步、特征选择是要去除掉冗余的特征。你提取了很多你认为是可能影响点击的因素,选择比较合适的放进去第四步、挖掘特征中潜在的信息可以做特征变换。挖掘特征里面的关系。第五步、选择合适的算法,建立机器学习的模型。(简单算法包括线性回顾,复杂的用深度神经网络)第六步、调整参数,使得模型的效果达到最优。第七步、模型评估,评估指标如Accuracy,AUC等。结果的好坏,需要有一个反馈机制,效果不好,重新进行特征选择。在推荐案例方面,前百度资深科学家、创立智铀科技的夏粉博士在创业家的APP中提到:该APP面向的用户是创业者和相关投资人。在这个场景下,内容方面目标是用户个性化推荐。最关键的是用户和文章找到最好的匹配。用户侧的信息会有:使用习惯(苹果还是安卓系统)、消费属性(是否注册,绑定银行卡)、兴趣特征(喜欢哪一个类别的文章)、自然属性(性、年龄)、社会属性。文章是基本属性、内容属性、运营属性、用户参与。
ID3算法就是对各个feature信息计算信息增益,然后选择信息增益最大的feature作为决策点将数据分成两部分Python代码实现思路: 这里这将tree的实现: 采用map的性质{"node": {}}表示, 一个的key表示一个node, 从左到右是信息增益由大到小, 树是在特征节点处理完才将数据样本填上的 说白了和数据结构学习的二叉树是一样的, left, right, data, 只不过这里的data是DataFrame对象罢了
grid.fit():运行网格搜索 grid_scores_:给出不同参数情况下的评价结果 best_params_:描述了已取得最佳结果的参数的组合 best_score_:成员提供优化过程期间观察到的最好的评分
从别的地方copy过来的1、sklearn基础介绍1.1、估计器(Estimator)估计器很多时候可以直接理解为分类器,主要包含两个函数: fit():训练算法,接收训练集和类别两个输入参数。 predict():预测测试集类别,接收测试集作为输入。 大多数sklearn的输入和输出的数据格式均为numpy格式或类似格式。1.2、转换器(Transformer)用于数据的预处理和数据转换,主要包含3个函数: fit():训练算法。 transform():用于数据转换。 fit_transform():合并fit()和transform()两个函数的功能1.3、流水线(Pipeline)流水线的功能主要有3个: 一是跟踪记录各步骤的操作,以便重现实现结果; 二是对各操作步骤进行封闭; 三是使代码的复杂程度不至于超出掌控的范围。 基本的使用方法: 流水线的输入为一连窜的数据挖掘步骤(装在列表中),前几步通过为转换器,但最后一步必须为估计器。输入的数据集经过转换器的处理后,其输出作为下一步的输入,最后经过估计器对数据进行分类。每一步都用元组(名称,函数)来表示。 下面来创建流水线。scaling_pipeline=Pipeline([('scale',MinMaxScaler()),('predict',KNeighborsClassifier())])1上面的这个例子中包含两个步骤,每个步骤都放在元组内,元组的第一个元素即为该步骤的名称,随便取便于理解功能即可,第二个元素为sklearn中实现相应功能的函数,很多时候直接看函数名便可猜到大致的功能。1.4、预处理(Preprocessing)主要在sklearn.preprocessing包下。这里的预处理都是针对特征值来操作的。具体功能如下: 规范化: MinMaxScaler():将特征值缩放至0~1之间,公式(xi−min(x))/(max(x)−min(x)) Normalizer():通过缩放使特征值的和为1,公式xi/sum(x) StandScaler():通过缩放使特征值的均值为0,方差为1,即为通常意义上的标准化,公式(xi−mean(x))/std(xi−mean(x)) 编码:是特征工程的一部分 LabelEncoder:将字符串类型的数据转换为整形 OneHotEncoder:用二进制数来表示特征 Binarizer:将数值型特征二值化 MultiLabelBinarizer:多标签二值化1.5、特征1.5.1特征抽取通过包sklearn.feature_extraction来实现 特征抽取是数据挖掘非常重要的一环,对最终结果的影响要高过数据挖掘算法本身。只有将现实事件用合适的特征表示出来,才能借助数据挖掘的力量找到其他的规律。特征抽取也可以降低事情的复杂程度。 一般最常用的特征抽取技术都是高度针对特定领域的。如图像处理领域,提出了很多特征抽取技术,但是这些技术在其他领域的应用却非常有限。 DictVectorizer():将dict类型的list数据转换为numpy array FeatureHasher():将特征哈希,将数据做哈希映射,同时能达到降维的效果 image():图像相关的特征抽取 text():文本相关的特征抽取 text.CountVectorizer():将文本转换为每个词出现个数的向量 text.TfidfVectorizer():将文本转换为逆文本词频向量 text.HashingVectorizer():将文本作哈希向量化1.5.2、特征选择包:sklearn.feature_selection 特征选择的原因: (1)降低数据复杂度 (2)降低噪声 (3)增强数据的可解释性 VarianceThreshold():删除方差达不到最低标准的特征 SelectKBest():返回K个最佳特征 SelectPercentile():返回表现最佳的前r%个特征 单个特征和某一类型特征之间相关性的计算方法有很多,如x2,其他的方法还有互信息和信息熵 **chi2():卡方检验1.6、降维包:sklearn.decomposition 算法的采用的是主成分降维(PCA)1.7、组合包:sklearn.ensemble ensemble下的算法均为组合算法,组合技术也就是通过聚合多个分类器的结果来提高分类等预测的准确率。 常用的组合分类器有下面3种处理方式: (1)通过随机抽取部分样本,组成多个训练集,得到多个模型,从而同一个样本有多个预测结果,从中得到最后的预测结果,从而提高预测准确性,如bagging和boosting。 (2)通过随机抽取部分特征,从而构成多个新的训练集,得到多个模型,从而可以对一个样本进行多次预测,采用少数服从多数的原则,得到最后的预测结果。随机森林则是综合了(1)、(2)两种处理方方法。 (3)通过对标签进行处理,适用于多分类的情况,将标号随机分成两个不相交的子集,把问题变成二分类问题,每一次都会得到一个预测结果,,重复构建多次模型,进行分类投票。 有以下的组合方法: BaggingClassifier: BaggingRegressor: AdaBoostClassifier: AdaBoostRegressor: GradientBoostingClassifier: GradientBoostingRegressor: ExtraTreeClassifier: ExtraTreeRegressor: RandomTreeClassifier: RandomTreeRegressor: 举例:AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),algorithm="SAMME",n_estimators=200)1从上例可以看到,AdaBoostClassifier是一种处理方式,但还需要指明与之配合的基础分类算法。1.8、模型评估包:sklearn.metrics 包含评分方法、性能度量、成对度量和距离计算 分类结果度量 输入大多为y_true,y_pred 具体评价指标如下: accuracy_score:分类准确度 condution_matrix:分类混淆矩阵 classification_report:分类报告 precision_recall_fscore_support:计算精确度、召回率、f、支持度 jaccard_similarity_score:计算jaccard相似度 hamming_loss:计算汉明损失 zero_one_loss:计算0-1损失 hinge_loss:计算hinge损失 log_loss:计算log损失回归结果度量 explained_variance_score:可解释方差的回归评分 mean_absolute_error:平均绝对误差 mean_squared_erro均方误差 聚类结果度量 adjusted_mutual_info_score:调整的互信息得分 silhouette_score:所有样本轮廓系数的平均值 silhouette_sample:所有样本轮廓系数 多标签的度量 coverage_error:涵盖误差 label_ranking_average_precision_score:基于排名的平均精度1.9、交叉验证包:sklearn.cross_validation KFold():交叉验证迭代器,接收元素个数、fold数、是否清洗 LeaveOneOut():交叉验证迭代器 LeavePOut():交叉验证迭代器 LeaveOneLableOut():交叉验证迭代器 LeavePLableOut():交叉验证迭代器 交叉验证是利用训练集本身来测试模型精度,思路是将训练集分成n份,然后按一定比例取其中的几份(大头)作为真正的训练集来训练模型,其中的几份(少数)不参与训练来验证模型精度。然后循环这个过程,得到多组测试精度。所以在交叉验证器里就涉及到抽取测试集的比例问题。 LeaveOneOut()就是从n份里抽1份作为测试集,LeavePOut()就是从n份里抽p份作为测试集。 LeaveOneOut(n) 相当于 KFold(1, n_folds=n) 相当于LeavePOut(n, p=1)。 而LeaveOneLableOut()和LeavePLableOut()与上面的区别在于,这里可以直接加入第三方的标签作为数据集的区分,也就是第三方标签已经把数据分成n份了。们的数据是一些季度的数据。那么很自然的一个想法就是把1,2,3个季度的数据当做训练集,第4个季度的数据当做测试集。这个时候只要输入每个样本对应的季度Label,就可以实现这样的功能。 常用方法: train_test_split:分离训练集和测试集,这一步一般是在交叉验证前做的,与KFold()不同 cross_val_score:交叉验证得分即精度,为一组数据,存放于列表中 cross_val_predict:交叉验证的预测结果1.10、网络搜索包:sklearn.grid_search 网络搜索是用来寻找最佳参数的。 GridSearchCV:搜索指定参数网格中的最佳参数 ParameterGrid:参数网络 ParameterSampler:用给定分布生成参数的生成器 RandomizedSearchCV:超参的随机搜索 通过best_estimator_get_params()方法获取最佳参数1.11、多分类、多标签分类包:sklearn.multiclass OneVsRestClassifier: 1-rest多分类(多标签)策略 OneVsOneClassifier: 1-1多分类策略 OutputCodeClassifier: 1个类用一个二进制码表示 在多标签的情况下,输入必须是二值化的。所以需要MultiLabelBinarizer()先处理。2、scikit-learn扩展2.1 概览具体的扩展,通常要继承sklearn.base包下的类。 BaseEstimator: 估计器的基类 ClassifierMixin :分类器的混合类 ClusterMixin:聚类器的混合类 RegressorMixin :回归器的混合类 TransformerMixin :转换器的混合类2.2 创建自己的转换器在特征抽取的时候,经常会发现自己的一些数据预处理的方法,sklearn里可能没有实现,但若直接在数据上改,又容易将代码弄得混乱,难以重现实验。这个时候最好自己创建一个转换器,在后面将这个转换器放到pipeline里,统一管理。 例如《Python数据挖掘入门与实战》书中的例子,我们想接收一个numpy数组,根据其均值将其离散化,任何高于均值的特征值替换为1,小于或等于均值的替换为0。from sklearn.base import TransformerMixinfrom sklearn.utils import as_float_arrayclass MeanDiscrete(TransformerMixin): #计算出数据集的均值,用内部变量保存该值。 def fit(self, X, y=None): X = as_float_array(X) self.mean = np.mean(X, axis=0) #返回self,确保在转换器中能够进行链式调用(例如调用transformer.fit(X).transform(X)) return self def transform(self, X): X = as_float_array(X) assert X.shape[1] == self.mean.shape[0] return X > self.mean123456789101112131415163、使用sklearn数据挖掘一般流程3.1、加载数据sklearn的实现使用了numpy的arrays,所以需要使用numpy来读入数据。# -*- coding: utf-8 -*-import numpy as npimport urllib.request#直接从网络上读取数据,该数据有767个样本,每个样本有9列,最后一列为标签列url="http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"rawdata=urllib.request.urlopen(url)#利用numpy.loadtxt从网络地址上读数据dataset=np.loadtxt(rawdata,delimiter=',')#也可以先将数据下载到本地,然后从本地路径上下载数据,只要将rawdata换成本地路径就可以了X=dataset[:,0:8]y=dataset[:,8]12345678910113.2、数据预处理大多数机器学习算法中的梯度方法对于数据的缩放和尺度都是很敏感的,在开始跑算法之前,我们应该进行归一化或者标准化的过程,这使得特征数据缩放到0-1范围中,归一化的方法,具体解释参考。 归一化(Normalization) 针对样本,例如from sklearn import preprocessingnormalized_X=preprocessing.normalize(X)12尺度缩放(Scaling) 针对变量,如scaled_X=preprocessing.scale(X)1标准化(Standardization)standardized_X=preprocessing.StandardScaler(X)13.3、特征工程3.4、模型训练以逻辑回归为例from sklearn.linear_model import LogisticRegressionfrom sklearn import metricsmodel=LogisticRegression()model.fit(X,y)print("模型:")print(model)expected=ypredicted=model.predict(X)print("结果报告 :")print(metrics.classification_report(expected,predicted))print("混淆矩阵:")print(metrics.confusion_matrix(expected,predicted))123456789101112结果如下:模型:LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False)结果报告 : precision recall f1-score support 0.0 0.79 0.90 0.84 500 1.0 0.74 0.55 0.63 268avg / total 0.77 0.77 0.77 768混淆矩阵:[[448 52] [121 147]]123456789101112131415163.5、算法参数优化具体参考官方文档 整体思路是,将需要搜索最优参数的一系列候选值赋给一个数组,然后用参数搜索接口如GridSearchCV去训练,而不是直接用算法去训练,这些搜索接口接受具体的算法和候选参数作为输入。返回的结果中就包含了最佳得分和最佳参数。 不同的算法涉及的参数是不一样的,以后有时间再慢慢写。
数据预处理 通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。存在缺失值:缺失值需要补充。信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。
转载地址:http://epwza.baihongyu.com/