labelonehotencoder label可以逆编码 吗

scikit-learn v0.19.1
Please if you use the software.
.LabelEncoder
class sklearn.preprocessing.LabelEncoder
Encode labels with value between 0 and n_classes-1.
Read more in the .
Attributes:classes_ : array of shape (n_class,)
Holds the label for each class.
encode categorical integer features using a one-hot aka one-of-K scheme.
LabelEncoder can be used to normalize labels.
&&& from sklearn import preprocessing
&&& le = preprocessing.LabelEncoder()
&&& le.fit([1, 2, 2, 6])
LabelEncoder()
&&& le.classes_
array([1, 2, 6])
&&& le.transform([1, 1, 2, 6])
array([0, 0, 1, 2]...)
&&& le.inverse_transform([0, 0, 1, 2])
array([1, 1, 2, 6])
It can also be used to transform non-numerical labels (as long as they are
hashable and comparable) to numerical labels.
&&& le = preprocessing.LabelEncoder()
&&& le.fit([&paris&, &paris&, &tokyo&, &amsterdam&])
LabelEncoder()
&&& list(le.classes_)
['amsterdam', 'paris', 'tokyo']
&&& le.transform([&tokyo&, &tokyo&, &paris&])
array([2, 2, 1]...)
&&& list(le.inverse_transform([2, 2, 1]))
['tokyo', 'tokyo', 'paris']
Fit label encoder
Fit label encoder and return encoded labels
Get parameters for this estimator.
Transform labels back to original encoding.
(**params)
Set the parameters of this estimator.
Transform labels to normalized encoding.
__init__()
Initialize self.
See help(type(self)) for accurate signature.
Fit label encoder
Parameters:y : array-like of shape (n_samples,)
Target values.
Returns:self : returns an instance of self.
fit_transform(y)
Fit label encoder and return encoded labels
Parameters:y : array-like of shape [n_samples]
Target values.
Returns:y : array-like of shape [n_samples]
get_params(deep=True)
Get parameters for this estimator.
Parameters:deep : boolean, optional
If True, will return the parameters for this estimator and
contained subobjects that are estimators.
Returns:params : mapping of string to any
Parameter names mapped to their values.
inverse_transform(y)
Transform labels back to original encoding.
Parameters:y : numpy array of shape [n_samples]
Target values.
Returns:y : numpy array of shape [n_samples]
set_params(**params)
Set the parameters of this estimator.
The method works on simple estimators as well as on nested objects
(such as pipelines). The latter have parameters of the form
&component&__&parameter& so that it’s possible to update each
component of a nested object.
Returns:self :
transform(y)
Transform labels to normalized encoding.
Parameters:y : array-like of shape [n_samples]
Target values.
Returns:y : array-like of shape [n_samples]实用指南-在python中使用Scikit-learn进行数据预处理_数据分析工具_小蚂蚁站长吧
您的当前位置: >
实用指南-在python中使用Scikit-learn进行数据预处理
  摘要:本文主要关注python中的数据预处理技术。学习算法对哪些类型的数据更加适合, 当使用不规则或者不标准的特征时,这些算法只能得出非常粗糙的预测。像XGBoost这样的算法会具体要求虚拟编码数据,而像决策树这样的算法则并不需要考虑这些(在某些情况下)。
  简单来说,预处理是指在将数据输入到算法之前对数据进行的转换。Python里的scikit-learn库在sklearn.preprocessing下有预构建的数据预处理函数。当然还有很多有待我们探索的预处理选项。
  学习完本文后,你会习得基本的数据预处理技术以及对它们的深入理解。方便起见,我附加了一些资源用于深入学习机器学习算法,并设计了少量练习,以便更好地掌握这些概念。
  可用的数据集
  本文我使用了一个贷款预测数据集的子集(缺失观察值被丢弃)。你可以从这里下载训练集和测试集:。
  注意:提供给您的测试数据是&贷款预测&问题的训练数据的子集。现在让我们从导入重要的包和数据集开始吧。
  # Importing pandas
  && import pandas as pd
  # Importing training data set
  && X_train=pd.read_csv(&X_train.csv&)
  && Y_train=pd.read_csv(&Y_train.csv&)
  # Importing testing data set
  && X_test=pd.read_csv(&X_test.csv&)
  && Y_test=pd.read_csv(&Y_test.csv&)
  我们来详细了解一下该 数据集的概况。
  && print (X_train.head())
  Loan_ID Gender Married Dependents Education Self_Employed15 & LP001032 & Male & & No & & & & 0 Graduate & & & & & No248 LP001824 & Male & & Yes & & & & 1 Graduate & & & & & No590 LP002928 & Male & & Yes & & & & 0 Graduate & & & & & No246 LP001814 & Male & & Yes & & & & 2 Graduate & & & & & No388 LP002244 & Male & & Yes & & & & 0 Graduate & & & & & NolicantIncome ColicantIncomeLoanAmountLoan_Amount_Term15 & & & & & & 4950 & & & & & & & &0.0 & & & & &125.0 & & & & & &360.0248 & & & & & 2882 & & & & & & 1843.0 & & & 123.0 & & & & & &480.0590 & & & & & 3000 & & & & & & 3416.0 & & & 56.0 & & & & & & &180.0246 & & & & & 9703 & & & & & & &0.0 & & & & & &112.0 & & & & & &360.0388 & & & & & 2333 & & & & & & &2417.0 & & &136.0 & & & & & &360.0Credit_History Property_Area
  15 & & & & & & & 1.0 & & & & Urban
  248 & & & & & & 1.0 & & Semiurban
  590 & & & & & & 1.0 & & Semiurban
  246 & & & & & & 1.0 & & & Urban
  388 & & & & & & 1.0 & & & &Urban
  特征缩放
  特征缩放是限制变量范围的方法,以便可以在同一基础上进行比较。数据集里均是连续型变量,让我们画出数据集里所有连续型变量的分布图。
  && import matplotlib.pyplot as plt
  && X_train[X_train.dtypes[(X_train.dtypes==&float64&P)|(X_train.dtypes==&int64&P)]
  .index.values].hist(figsize=[11,11])
  在理解这些图之后,我们推断ApplicantIncome和Coapplantantcome在几乎相同的范围(0-50000 $)中,而LoanAmount是以千为单位,其范围从0到600 $。 Loan_Amount_Term则与其他变量完全不同,因为它的单位是月,其他变量的单位则是美元。
  如果我们尝试对这些特征应用基于距离的方法,例如KNN,则具有最大范围的特征将主导预测结果,因此我们将获得不准确的预测。 我们可以使用特征缩放来克服这个问题。 让我们实践看看。
  学习资源:查看这篇关于的文章,以更好地理解。
  让我们尝试用KNN算法来使用数据集,以了解它的性能。
  # Initializing and Fitting a k-NN model
  && from sklearn.neighbors import KNeighborsClassifier&& knn=KNeighborsClassifier(n_neighbors=5)&& knn.fit(X_train[[&ApplicantIncome&, &CoapplicantIncome&,&LoanAmount&, & & & & & & & & & &&Loan_Amount_Term&, &Credit_History&]],Y_train)# Checking the performance of our model on the testing data set&& from sklearn.metrics import accuracy_score&& accuracy_score(Y_test,knn.predict(X_test[[&ApplicantIncome&, &CoapplicantIncome&,&LoanAmount&, &Loan_Amount_Term&, &Credit_History&]]))Out : 0.33337
  我们的预测模型得到了大约61%的正确率,这不算坏,但在现实世界中这样就够了吗? 我们可以应用这个模型来处理现实世界的问题吗? 为了回答这个问题,让我们来看看训练数据集中Loan_Status的分布情况。
  && Y_train.Target.value_counts()/Y_train.Target.count()Out : Y 0.705729
  N 0.294271Name: Loan_Status, dtype: float64有70%的批准贷款,因为有更多的批准贷款,我们将产生一个预测,所有的贷款都批准,让我们继续和检查我们的预测的准确性。
  && Y_test.Target.value_counts()/Y_test.Target.count()Out : &Y 0.635417
  N 0.364583
  Name: Loan_Status, dtype: float64
  哇 !! 我们仅通过猜测得到的准确度为63%,这是什么意思?得到比我们的预测模型更好的准确性?
  这是有可能发生的,因为一些有较大的范围的不重要变量将主导目标函数。我们可以通过将所有特征缩小到相同范围来消除此问题。 sklearn提供了一个工具MinMaxScaler,它将所有特征缩小到0和1之间。MinMaxScaler的数学公式为:
  让我们尝试使用这个工具。
  # Importing MinMaxScaler and initializing it&& from sklearn.preprocessing import MinMaxScaler&& min_max=MinMaxScaler()
  # Scaling down both train and test data set&& X_train_minmax=min_max.fit_transform(X_train[[&ApplicantIncome&, &CoapplicantIncome&,&LoanAmount&, &Loan_Amount_Term&, &Credit_History&]])&& X_test_minmax=min_max.fit_transform(X_test[[&ApplicantIncome&, &CoapplicantIncome&,&LoanAmount&, &Loan_Amount_Term&, &Credit_History&]])现在,我们已经完成了数据缩放,让我们对缩放的数据应用KNN算法并检查其准确性。
  # Fitting k-NN on our scaled data set
  && knn=KNeighborsClassifier(n_neighbors=5)&& knn.fit(X_train_minmax,Y_train)
  # Checking the model&s accuracy
  && accuracy_score(Y_test,knn.predict(X_test_minmax))Out : 0.75
  太棒了!我们的准确度从61%提高到了75%。这意味着一些具有较大范围的特征主导了基于距离的方法(KNN)的预测结果。
  应该记住,在执行基于距离的方法时,我们必须尝试缩放数据,使得具有较小重要性的特征不会由于其较大的范围而主导目标函数。此外,具有不同单位的特征也应该被缩放,从而赋予每个特征相等的初始权重,从而在最终获得更好的预测模型。
  练习一
  尝试使用逻辑回归模型(参数:penalty =&l2&,C = 0.01)进行相同的练习,并在注释中注明缩放之前和之后的预测准确性。
  特征标准化
  阅读本节之前,我建议你先完成练习一。
  在上一节里,我们研究了贷款预测数据,并在数据集上拟合了一个KNN学习器。在缩放数据之后,我们的准确率达到了75%,这已经相当好了。我尝试用逻辑回归进行了同样的练习,得到了下面的结果:
  缩放数据前:61%
  缩放数据后:63%
  缩放后获得的正确率接近我们通过猜测所做的预测,这一结果并不尽如人意。所以这里发生了什么呢?为什么正确率没有像在KNN算法中提升那么大呢?
  学习资源:通过这篇文章来更好的理解逻辑回归。
  这里是答案:
  在逻辑回归中,每个特征会被赋予一个权重或者系数。如果存在具有较大范围的特征,并且其在目标函数中是没有显著影响的,那么逻辑回归本身将对其系数分配非常低的值,从而中和该特定特征的主导效应,而基于距离的方法例如KNN 没有这个内置策略,因此它需要缩放。
  我们是不是忘记了什么?我们的逻辑模型仍然维持着接近猜测的正确率。现在我将在这里引入一个新的概念,称为标准化。Sklearn中的许多机器学习算法需要标准化数据,指具有零均值和单位方差的数据。
  标准化是特征值被重新缩放的过程,是的他们具有期望为0,标准差为1的标准正态分布的属性。标准分数(也成为z分数)的计算公式如下:
  Screenshot from
  诸如线性模型中的l1,l2正则化器(logistic正是在该类别下)和在学习器SVM中的RBF核函数所认为的那样,所有特征以零为中心并且具有相同阶数的方差。
  具有较大方差阶数的特征将主导目标函数,就像前文中里具有大范围的特征就是这样。 正如我们在练习1中看到的,对数据没有任何预处理的准确率是61%,让我们标准化我们的数据然后再应用逻辑回归。 Sklearn提供scale函数来标准化数据。
  # Standardizing the train and test data
  && from sklearn.preprocessing import scale&& X_train_scale=scale(X_train[[&ApplicantIncome&, &CoapplicantIncome&,&LoanAmount&, &Loan_Amount_Term&, &Credit_History&]])&& X_test_scale=scale(X_test[[&ApplicantIncome&, &CoapplicantIncome&, & & & & & & & &LoanAmount&, &Loan_Amount_Term&, &Credit_History&]])# Fitting logistic regression on our standardized data set&& from sklearn.linear_model import LogisticRegression&& log=LogisticRegression(penalty=&l2&,C=.01)&& log.fit(X_train_scale,Y_train)
  # Checking the model&s accuracy&& accuracy_score(Y_test,log.predict(X_test_scale))Out : 0.75
  我们再次得到了我们在缩放后使用KNN获得的最大准确率。这意味着当使用具有l1或l2正则化的估计器时标准化数据有助于我们提高预测模型的准确性。 其他学习器如KNN与欧几里德距离测量,k均值,SVM,感知器,神经网络,线性判别分析,主成分分析在标准化数据上具有更好的预测性能。
  然而我还是建议你先去理解你的数据和将要使用的算法有何特征; 在一段时间后,您将能够判断是否标准化您的数据。
  在缩放和标准化之间进行选择,通常会让人觉得很困惑。你必须深入了解你的数据和学习器,然后才能做出决定。对于初学者,你可以尝试这两种方法并比较交叉验证正确率以作出选择。
  资源:阅读这篇文章来更好地理解交叉验证。
  练习二
  尝试使用SVM模型进行相同的练习,并在注释部分中提供标准化之前和之后的准确率。
  资源:阅读这篇文章来理解SVM 。
  标签编码
  在前面几节,我们对连续型数据进行了预处理。但是我们的数据集也会有诸如性别、是否已婚、家属、职业和教育等特征值。这些分类特征的值均是字符串。例如,性别有两个值:male(男)和female(女)。让我们在逻辑回归模型中使用这些值。
  # Fitting a logistic regression model on whole data&& log=LogisticRegression(penalty=&l2&,C=.01)&& log.fit(X_train,Y_train)
  # Checking the model&s accuracy
  && accuracy_score(Y_test,log.predict(X_test))Out : ValueError: could not convert string to float: Semiurban我们看到了一个报错,说它不能将字符串转换为浮点数。 所以,实际情况是Sklearn中的学习器,如逻辑回归,基于距离的方法,如KNN,支持向量机,基于树的方法等需要数值数组。 这些学习器不能处理具有字符串值的特性。
  Sklearn提供了一个非常有效的工具,用于将分类特征的级别编码为数值。 LabelEncoder函数将标签值编码为0到属性个数值-1之间的值。
  让我们来对分类标签进行编码。
  # Importing LabelEncoder and initializing it&& from sklearn.preprocessing import LabelEncoder&& le=LabelEncoder()
  # Iterating over all the common columns in train and test&& for col in X_test.columns.values:
  # Encoding only categorical variables
  if X_test[col].dtypes==&object&:
  # Using whole data to form an exhaustive list of levelsdata=X_train[col].append(X_test[col])
  le.fit(data.values)
  X_train[col]=le.transform(X_train[col])
  X_test[col]=le.transform(X_test[col])
  我们所有的分类标签已经被编码了。你可以使用X_train.head()来查看更新后的数据集。我们将看看编码之前和之后的性别频率分布。
  Before : Male 318
  Female 66 Name: Gender, dtype: int64
  After : 1 &318
  0 & 66
  Name: Gender, dtype: int64
  既然我们已经完成了标签编码,现在让我们对具有分类和连续特征的数据集应用逻辑回归模型。
  # Standardizing the features
  && X_train_scale=scale(X_train)
  && X_test_scale=scale(X_test)
  # Fitting the logistic regression model
  && log=LogisticRegression(penalty=&l2&,C=.01)&& log.fit(X_train_scale,Y_train)
  # Checking the models accuracy
  && accuracy_score(Y_test,log.predict(X_test_scale))Out : 0.75
  现在模型起作用了。但是正确率和我们对连续型变量标准化后得到的正确率一样。这意味着我们添加的分类特征在我们的目标函数中不是非常重要。
  练习三
  尝试将所有特征作为独立变量来使用决策树分类器,并在评论里写下您的准确性。
  资源:阅读这篇文章来理解决策树。
  一位有效编码
  一位有效编码将每个具有n个可取值的分类特征的值转换为n位二进制特征值,其中只有一位有效(置1,其余位为0)。
  大多数机器学习算法为每个特征学习一个权重或者计算样本之间的距离。 线性模型(如逻辑回归)的算法属于第一类。
  让我们来看看贷款预测数据集的一个例子。 特征家属(dependents)具有4个可能的值0,1,2和3+,然后在不失去0,1,2和3的一般性的情况下进行编码。
  然后,我们在线性分类器中为该特征分配权重&W&,其将基于约束W * Dependents + K& 0或等效地W * Dependents &K来做出决定。
  令f(w)= W*Dependents。
  等式可取的值为0,W,2W和3W。 这个方程的问题是权重&W&不能基于四个选择做出决定。它可以通过以下方式达成一项决定:
  所有输入做出同样的决定(所有的f(w)&k 或者&k)3:1的比例划分(决策边界是 f(w)&2W)
  2:2的比例划分(决策边界是f(w)&W)
  在这里我们可以看到,我们失去了许多不同的可能的决定,例如&0和&2W&应该给予相同的标签,&3W&和&W&则应该删去一个。
  这个问题可以通过一位有效编码来解决,因为它有效地将特征&家属&(dependents)的维度从一变为四,因此特征&家属&中的每个值将具有它们自己的权重。 用于判定的更新方程将是f&(w)&K。
  其中f'(w) = W1*D_0 + W2*D_1 + W3*D_2 + W4*D_3。每个变量的值是0或者1。
  同样的事情发生在基于距离的方法,如KNN。 未编码的情况下,家属的&0&和&1&值之间的距离是1,而&0&和&3+&之间的距离将是3,这不是我们期望的,因为两个距离应该相似。编码之后,值将是新的特征(列的序列是0,1,2,3+):[1,0,0,0]和[0,0,0,1](最初我们发现距离 &0&和&3+&),现在的距离将是 。
  对于基于树的方法,同样的情况(一个特征有两个以上的值)可能影响结果的范围,但是如果像随机森林这样的方法足够深,它可以不使用一位有效编码就能处理分类变量。
  现在让我们来看看各种算法中一位有效编码的实现方法。
  让我们在不使用一位有效编码的情况下,来构建一个逻辑回归模型,并对其进行分类。
  # We are using scaled variable as we saw in previous section that# scaling will effect the algo with l1 or l2 reguralizer&& X_train_scale=scale(X_train)
  && X_test_scale=scale(X_test)
  # Fitting a logistic regression model
  && log=LogisticRegression(penalty=&l2&,C=1)&& log.fit(X_train_scale,Y_train)
  # Checking the model&s accuracy
  && accuracy_score(Y_test,log.predict(X_test_scale))Out : 0.33337
  现在我们对数据进行一位有效编码。
  && from sklearn.preprocessing import OneHotEncoder&& enc=OneHotEncoder(sparse=False)
  && X_train_1=X_train&& X_test_1=X_test
  && columns=[&Gender&, &Married&, &Dependents&, &Education&,&Self_Employed&, & & & & &Credit_History&, &Property_Area&]
  && for col in columns:
  # creating an exhaustive list of all possible categorical valuesdata=X_train[[col]].append(X_test[[col]]) & & & enc.fit(data)# Fitting One Hot Encoding on train data
  temp = enc.transform(X_train[[col]])
  # Changing the encoded features into a data frame with new column names & & & temp=pd.DataFrame(temp,columns=[(col+&_&+str(i)) for i in data[col]
  .value_counts().index])
  # In side by side concatenation index values should be same# Setting the index values similar to the X_train data frametemp=temp.set_index(X_train.index.values)# adding the new One Hot Encoded varibales to the train data frameX_train_1=pd.concat([X_train_1,temp],axis=1)# fitting One Hot Encoding on test data
  temp = enc.transform(X_test[[col]])
  # changing it into data frame and adding column namestemp=pd.DataFrame(temp,columns=[(col+&_&+str(i)) for i in data[col]
  .value_counts().index])
  # Setting the index for proper concatenationtemp=temp.set_index(X_test.index.values)
  # adding the new One Hot Encoded varibales to test data frameX_test_1=pd.concat([X_test_1,temp],axis=1)现在我们对编码过的数据使用逻辑回归模型。
  # Standardizing the data set
  && X_train_scale=scale(X_train_1)
  && X_test_scale=scale(X_test_1)
  # Fitting a logistic regression model
  && log=LogisticRegression(penalty=&l2&,C=1)&& log.fit(X_train_scale,Y_train)
  # Checking the model&s accuracy
  && accuracy_score(Y_test,log.predict(X_test_scale))Out : 0.75
  在这里,我们再次得到我们到目前为止得到的最大准确率0.75。 在这种情况下,逻辑回归正则化(C)参数1,而较早时我们使用C = 0.01。
  结束语
  本文的目的是让您熟悉基本的数据预处理技术,并更深入地了解应用这些技术的情况。
  当算法的基本假设满足时这些方法会起作用。 这里绝不是详尽的方法列表。 我鼓励你尝试这些方法,因为它们可以根据手头的问题进行大量修改。
  我计划在我的下一篇文章中提供更先进的数据预处理技术,例如管道模型和减噪,所以请继续关注以深入了解数据预处理。
  你喜欢阅读这篇文章吗? 你使用了不同的方法/包/库来进行这些预处理吗? 我很愿意与你在评论中交流。
上一篇: 下一篇:
相关文章推荐:
热门阅读推荐:
图文精选:
数据透视是GA报表的一个隐藏技能。它是一个极其强大的数据汇总工具,能实现...
今天聊一下增长黑客。 增长黑客是近年来国外很火热的...
3月14日晚,“十点读书”粉丝数正式突破 1500 万。2月1...
站群,一个在SEO界躲在灰暗角落的词。提到站群,很多时候会想到链轮。在那时,操作链轮,很多人都……
进行了2个多月的APP大改版即将结束,为此产品技术团队真的是尽心尽力,猛追...
互联网的发展瞬息万变。人口红利终结、移动互联异军突起、视频化进展迅速、...
据国外媒体报道,谷歌在Project Glass上采取的透明产品策略有助于该产品在市场...
增长黑客整本书最主要的内容就是围绕AARRR转化模型介绍...
这次带来的是Adhithya的一系列的关于思考车内人机交互的...
在谈“如何防止活动用户大量流失”这个话题之前,我必须先把一场活动的前前后后说清楚。……
虽然用户体验的定义只有一句话,但是如何才能让用户成本降至最低需要花费很...
在 Web/iOS/Android 等旧平台成熟稳定、VR/AR 等新平台尚未全面兴起,设计标准化成...
用户价值是用户体验的前提,没有用户价值,用户体验就是空谈。 1用户体验与...
一、运营产生数据,数据支撑运营 数据分析这件事情,...
一份优秀的网站分析报告是什么样的?The Action Dashboard(...
“以用户为中心”的理论要求网站不断优化改善用户的体验,进而提升用户的满意度,当用户的预期不……
受访页面报告提供了访客对您网站内各个页面的访问情况数据。通过这个报告,...
百度统计为网站接入者提供了多维度的数据报告,其中一些报告是用户经常使用...
成为数据科学家很有意思的一点是我们会被要求预测未来。...
6月21日,新华社微信公众号发布的《刚刚,沙特王储被废...
作为移动端APP产品运营最重要的运营手段,消息推送(p...
作为移动端APP产品运营最重要的运营手段,消息推送(push)被越来越多的APP厂商所重视,在信息泛滥的移……
在未来1-2个月里,每周二、四,你可以在三节课微信公号看到这个连载,遇突发事件...
今天亮哥飞深圳,明天要在华为开一场单口相声,正好,后台有同学问到了社区运营...
互联网产品是满足网络用户需求的工具,产品的分类有很多,以终端划分可分为...
产品都有生命周期,比如种子期、成长期、爆发期、衰落...
用户获取的成本越来越高,用户获取越来越困难,不妨使...
用户获取的成本越来越高,用户获取越来越困难,不妨使用落地页,轻松实现用户增长。……
本文作者希望通过显性需求和隐性需求的讲述,帮助大家如何快速分析出目标用...
策划一个优质的活动,需要运营人员具备两种素质,一种素质是策划活动的能力...
上周小贤给我安利了有一位非常具有成长代表性的运营朋友(冷威龙)。他从大...
 在做内容运营时,内容审核是一个绕不开的话题。运营...
在微博刚兴起时,由于其带来的价值有限以及各初创团队...
通过分析测试确定早期的内容方向之后,接下来面临的问题就是持续地输出内容...
自媒体成了新的淘金蓝海,大号们争先恐后开展内容电商(据新榜 2016 年数据统...
热门关键词

我要回帖

更多关于 labelencoder nan 的文章

 

随机推荐