特征选择技术总结

在本文中,我们将回顾特性选择技术并回答为什么它很重要以及如何使用python实现它。

本文还可以帮助你解答以下的面试问题:

  • 什么是特征选择?
  • 说出特性选择的一些好处
  • 你知道哪些特征选择技巧?
  • 区分单变量、双变量和多变量分析。
  • 我们能用PCA来进行特征选择吗?
  • 前向特征选择和后向特征选择的区别是什么?

什么是特征选择,为什么它很重要?

特性选择是选择与ML模型更加一致、非冗余和更相关的基本特性的过程。在ML项目中使用特性选择是必要的,因为:

  • 它有助于减少数据集的大小和复杂性,并且可以使用更少的时间来训练模型及进行推理;
  • 具有较少特征的简单机器学习模型更容易理解和解释;
  • 它可以避免过度拟合。更多特征使模型变得更加复杂,并带来维度灾难(误差随着特征数量的增加而增加)。

特征选择方法有哪些?

有两种常见的方法可以处理特征选择:

1、前向特征选择。使用一个特征(或一小部分)拟合模型并不断添加特征,直到新加的模型对ML 模型指标没有影响。可以使用相关分析等方法(例如,基于 Pearson 系数),或者您可以从单个特征或特征子集开始拟合模型。

2、向后特征选择。这是 与1的相反方法。使用这种方法,可以从完整的特征集开始,然后迭代地逐个减少功能,减少特征的同时只要 ML 模型指标保持不变即可。

我们可以将一些流行的方法总结成以下几种分类:

  • Filtered-based基于过滤的方法:这种方法是最直接的,这种特征的选择独立于任何机器学习算法。使用统计数据(例如 Pearson 相关系数、LDA 等),根据每个特征如何影响目标结果来选择重要特征。这是计算密集度最低且速度最快的方法。
  • Wrapper 基于包装器方法:这种方法根据 ML 训练指标结果选择特征。每个子集在训练后得到一个分数,然后添加或删除特征,并在最终在达到所需的 ML 指标阈值时停止,这种方法可以是前向、后向或递归的。这是计算最密集的方法,因为需要训练许多 ML 模型,并且逐一进行判断选择。
  • Embedded 基于嵌入的方法:这种方法更加复杂,它将上面两种方法组合在一起。这种方法最流行的例子是 LASSO 和树型算法。

使用Python进行特征选择

本文将使用一个金融科技数据集,该数据集包含过去贷款申请人的数据,如信用等级、申请人收入、DTI和其他特征。最后的目标是使用ML预测贷款申请人是否可能违约(无法支付贷款)。这有助于企业做出决策,例如拒绝贷款申请、减少贷款金额或以更高的利率向风险较高的申请人放贷。我用来运行代码的环境是Kaggle。

让我们开始并加载数据集:

 %matplotlib inline 
 from matplotlib import pyplot as plt
 pd.set_option('display.float_format', lambda x: '%.0f' % x) 
 loan = pd.read_csv('../input/lending-club/accepted_2007_to_2018Q4.csv.gz', compression='gzip', low_memory=True)
 loan.info

数据集包含超过200万行(我们称之为样本)和超过150个特征。这是相当大的数据量,这些数据通常包含了很多“噪声”它对我们的ML工作没有任何的帮助,因此我们需要在ML训练发生之前验证数据的质量和适用性。

第一步:获得专业的领域知识

对如此详尽的特征列表进行分析可能需要大量的计算资源和时间。所以我们需要详细了解每个数据集的属性。

咨询并询问行业的专家哪些特征是必要的;例如,在金融科技数据集的例子中可能需要咨询每天执行贷款评估的信贷员。信贷员将确切地知道是什么驱动了他们的决策过程(我们其实是希望将这部分过程通过ML实现自动化)。

假设我们已得到了以下建议(请参阅下面的代码片段)。虽然我们应该对这些建议保持谨慎,但它为我们开始初步工作提供了一个很好的基础,我们可以进一步改进。

 loans = loan[['id', 'loan_amnt', 'term','int_rate', 'sub_grade', 'emp_length','grade', 'annual_inc', 'loan_status', 'dti', 'mths_since_recent_inq', 'revol_util', 'bc_open_to_buy', 'bc_util', 'num_op_rev_tl']] 
 
 #remove missing values 
 loans = loans.dropna()

花合理的时间来理解数据集中每个特征的含义:

  • loan_amnt -借款人申请贷款的清单金额。
  • term -偿还贷款的次数,其中的值以月为单位,可以是36或60。
  • int_rate -贷款的利率
  • sub_grade -根据借款人的信用记录分配贷款等级分数
  • emp_length -借款者的就业年限。
  • home_ownership-借款人提供的房屋所有权状况(例如,租金、所有权、抵押贷款等)
  • annual_inc -借款人提供的自我报告的年收入
  • addr_state-借款人在贷款申请中提供的状态
  • dti -用借款人每月偿还的债务总额(不包括按揭)除以借款人每月收入计算的比率。
  • mths_since_recent_inq-最近一次查询的月份
  • revol_util - 循环额度利用率,或借款人使用的信贷金额相对于所有可用的循环信贷。
  • bc_open_to_buy - 银行卡的总开放购买量
  • bc_util - 所有银行卡账户的总流动余额与高信用/信用限额的比率
  • num_op_rev_tl - 开户数
  • loan_status - 当前贷款状态(例如,完全支付或注销)。这就是我们要用模型预测的标签。

在进行下一步工作之前,需要先执行数据处理步骤。步骤包括缺失值、异常值和分类特征处理。

 loans = loans.dropna() 
 
 q_low = loans["annual_inc"].quantile(0.08) 
 q_hi = loans["annual_inc"].quantile(0.92) loans = loans[(loans["annual_inc"] < q_hi) & (loans["annual_inc"] > q_low)] 
 loans = loans[(loans['dti'] <=45)] 
 q_hi = loans['bc_open_to_buy'].quantile(0.95) 
 loans = loans[(loans['bc_open_to_buy'] < q_hi)] 
 loans = loans[(loans['bc_util'] <=160)] 
 loans = loans[(loans['revol_util'] <=150)] 
 loans = loans[(loans['num_op_rev_tl'] <=35)] 
 
 cleaner_app_type = {"term": {" 36 months": 1.0, " 60 months": 2.0},
      "sub_grade": {"A1": 1.0, "A2": 2.0, "A3": 3.0, "A4": 4.0,
           "A5": 5.0, "B1": 11.0, "B2": 12.0, "B3": 13.0, "B4": 14.0,
           "B5": 15.0, "C1": 21.0, "C2": 22.0, "C3": 23.0, "C4":
           24.0, "C5": 25.0, "D1": 31.0, "D2": 32.0, "D3": 33.0,
           "D4": 34.0, "D5": 35.0, "E1": 41.0, "E2": 42.0, "E3":
           43.0, "E4": 44.0, "E5": 45.0, "F1": 51.0, "F2": 52.0,
           "F3": 53.0, "F4": 54.0, "F5": 55.0, "G1": 61.0, "G2":
           62.0, "G3": 63.0, "G4": 64.0, "G5": 65.0, }, 
       "emp_length": {"< 1 year": 0.0, '1 year': 1.0, '2 years': 2.0,
           '3 years': 3.0, '4 years': 4.0, '5 years': 5.0, '6 years':
            6.0, '7 years': 7.0, '8 years': 8.0, '9 years': 9.0, '10+
            years': 10.0 } 
        } 
 loans = loans.replace(cleaner_app_type)

在预选特征之后,下一步是进行单变量分析。分析单个特征时可以使用的最常见的两种技术:1)删除低方差(超过90%)的特征;2)删除有大量缺失值的特征。

低方差:假设有两个特征,1)性别只包含一个性别值(例如,女性),2)年龄包含30到50岁之间的不同值。在这种情况下,性别特征的方差很小,因为这个属性中的值都是相同的,在模型训练时,它不会帮助模型找到任何模式;因此我们可以直接删除这个特征。

这种方式得实现非常简单,可以使用sklearn得VarianceThreshold函数。下面的代码将识别那些在至少90%的实例中相同的特性。

 from sklearn.feature_selection import VarianceThreshold
 variance = VarianceThreshold(threshold = (.9 * (1 - .9)))
 variance.fit(loans)
 variance.get_support()

可以看到在我们的案例中没有低方差的特征,所以不需要删除。

缺失值:在这组特征中没有任何包含大量缺失值的特征;因此,我们将跳过这一步。以前我们也发过处理缺失值的文章,如果你对这部分感兴趣,可以搜索查看。

第二步:识别高度相关的特征

第二步是识别特征的多重共线性。我们使用双变量分析来找出两组变量之间是否有关系(相关)。

利用这些相关性,你可以得到以下的结论:

  • 一个或多个变量依赖于另一个变量,可能导致多重共线性;
  • 相关性可以帮助预测一个变量与另一个变量的关系,表明存在因果关系;
  • 在业务层面上可以了解标签结果的因素,在我们的例子中了解每个特性如何影响贷款支付结果

当数据集的特征之间具有高度的正相关或负相关时,ML模型可能会受到多重共线性的影响。高度相关的特征可能提供相同的信息。在这种情况下可能会导致扭曲或误导的结果,为了解决这个问题,我们可以只保留一个特征,删除多余的特征,这样是不丢失任何信息的。

比如月薪和年薪;虽然它们可能不一样,但它们可能有相同的模式。像逻辑回归和线性回归这样的模型对这个问题很敏感,如果用这样的冗余特征训练模型,可能会产生误导的结果。因此我们应该以消除其中一个为目标。

注意:决策树和增强树等算法不受多重共线性的影响。

如何处理多重共线性?

有很多方法可以处理它。检测高度相关特征的最简单方法是使用 Pearson 相关系数并删除十分(~90%)相关特征。主成分分析(PCA)也可以用作降维算法。它通常用于降维,它将每个数据点仅投影到前几个主成分上获得低维数据的同时尽可能多地保留数据的变化。

这里我们使用pandas_profiling来进行分析

 from pandas_profiling import ProfileReport 
 profile = ProfileReport (loans, title = 'Loans Defaults Prediction', html = {'style': {'full_width': True }}) 
 profile

你会发现Pearson和Phik之间不同类型的相关性。当数据中包含未处理的分类特性时,Phik是非常好用的。例如,下面的“grade”分类特征,它在相关矩阵上绘制得很好:

如何理解相关矩阵:相关性范围从+1到-1,其中:

  • 零相关表示变量之间没有关系;
  • 相关性为-1表示完全负相关,这意味着当一个变量上升时,另一个变量下降;
  • 相关性为+1表示完全正相关,这意味着两个变量一起朝同一个方向移动。

上图可以观察到以下高度相关的特征:

  • 客户信息相关的特征:bc_open_to_buy / num_op_rev_tl。这两个特征都与循环账户和银行卡有关,因此它们高度相关。为了避免多协同问题,去掉初始模型中的bc_open_to_buy特性。revol_util / bc_util。也是一个类似的情况,可以删除bc_util特性。
  • 贷款信息特性:Int_rate和grade是基于借贷专有模型的sub_grade的衍生品;因此它们是高度相关的;我们把这些删除。这里的sub_grade和loan_amount也是相关的,但关联度较低,可以保留它们。
 loans.drop(["bc_util", "bc_open_to_buy","int_rate", "grade"], axis = 1, inplace = True)

第三步:找出特征与目标变量之间的相关性

我们希望能够找到与目标变量(在本例中为loan_status)高度相关的特性。这里将回顾上面介绍的两种流行的方法:

基于过滤的方法

相关矩阵可以帮助我们识别高度相关的特征。pandas_profiling生成分析报告可能需要时间,因此了解绘制相关矩阵的其他技术是必要的。下面是两种可选方法:

使用pandas自带的corr函数

 loans_cor=loan.corr() 
 loans_cor

使用seaborn热点图

 import seaborn as sns 
 import matplotlib.pyplot as plt 
 %matplotlib inline 
 plt.figure(figsize=(10,6)) 
 sns.heatmap(loans_cor, annot=True)

我们可以观察到以下高度相关的特征:sub_grade, term, loan_amnt, dti, emp_length, annual_inc与loan_status。这可以让我们知道哪些特性是重要的。

包装器方法

包装器的方法是一种选择特征的更自动化的方式,我们将使用内置函数 SequentialFeatureSelector()实现前向选择,该函数是 mlxtend 库的一部分。此函数具有不同的特征选择技术。

SequentialFeatureSelector() 有 11 个参数,您可以调整这些参数以获得最佳结果。我们这里将调整以下参数:

  • Estimator——核心使用的算法;在这个们的例子中将使用 LogisticRegression() 算法;
  • k_features — 希望算法选择为最佳特征的特征数(默认为 1)。它应该小于数据集的所有特征数总和。mlxtend 包还提供了“best”参数,其中选择器返回最佳交叉验证性能。因此,与其猜测需要返回多少特征,不如应用“best”;
  • Forward 和 floating 参数来标识包装器方法:例如,对于我们的前向选择,它将是forward = True,而floating = False;
  • Scoring :指定了评估标准:使用 sklearn 评分指标“precision”。对于分类器,因为数据集是不平衡的。我们还可以使用 f1、precision、recall、roc_auc 等用于分类任务的指标和 r2 、mean_absolute_error、mean_squared_error/neg_mean_squared_error、median_absolute_error 用于回归任务的指标;
  • cv——交叉验证,默认为5。

现在让我们将上面定义的特征选择器应用到的数据集中。

对于给定的数据将尝试一个非常常见的算法-逻辑回归序列特征选择器。Loan_status将被用作预测的标签以查找预测的依赖项:

 from sklearn.model_selection import train_test_split, RandomizedSearchCV 
 from sklearn.linear_model import LogisticRegression 
 from sklearn import metrics 
 from sklearn.preprocessing import MinMaxScaler
 X = loans.drop('loan_status', axis=1) 
 y = loans[['loan_status']] 
 y = y.values.ravel() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y)
 scaler = MinMaxScaler() 
 X_train = scaler.fit_transform(X_train) 
 X_test = scaler.transform(X_test)

下一步是我们将使用SequentialFeatureSelector来寻找“最佳”特征:

 from mlxtend.feature_selection import SequentialFeatureSelector as SFS
 
 sfs = SFS(LogisticRegression(),
           k_features='best', 
           forward=True, 
           floating=False, 
           scoring = 'precision', 
           cv = 0)

将上面的特征选择器应用到我们的数据:

 sfs.fit(X, y) 
 sfs.k_feature_names_

返回并查看ML任务应该使用的最佳特性:

通过比较每个训练步骤中的性能和特征数量来了解选择过程。还可以看到所选择的模型度量在迭代步骤中不会发生很大的变化。

 from mlxtend.plotting import plot_sequential_feature_selection as plot_sfs 
 import matplotlib.pyplot as plt 
 fig1 = plot_sfs(sfs.get_metric_dict(), kind='std_dev') plt.title('Sequential Forward Selection') 
 plt.grid() 
 plt.show()

可以看到不同特征的指标表现

总结

在本文中,我们介绍了特征选择技术的基本原理,这对理解重要特征和结果变量之间的相关性是非常关键的。本篇文章的代码:https://www.kaggle.com/code/mariiagusarova/feature-selection-techniques

作者:Maria Gusarova

本文转载于网络 如有侵权请联系删除

相关文章

  • Flink Forward Asia 2020 的收获和总结

    前言FlinkForwardAsia2020三天的分享已经结束,在这次分享上,自己也收获到了很多。这里写一篇文章来记录下自己这次的收获和总结,从个人的视角以及理解,和大家一起分享下,当然,如果有理解错误的地方,也欢迎大家指出。1.Flink已经成为实时计算事实标准我相信很多公司实时计算的发展都是从Strom到SparkStreaming,然后再到Flink这样一个发展的历程。从引擎本身来讲,Flink支持更低的实时计算时延,以及对于任务状态的支持。目前从国内各大公司使用来看,Flink已经成为了各个公司在实时计算方面的首选,同时Flink社区也非常的活跃,Flink所支持功能也在不断的完善。ApacheFlink已经成为各行业实时计算方面的事实标准。2.Flink+AIFlink本质是一个流式计算引擎,那么实时计算出的数据要发挥数据本身的价值,与AI结合,便是一个非常好的方向。Alink今年新增数十个开源算法,同时在算法工作流方面,开源了FlinkAIFlow,可以看到Flink在机器学习方面,功能迭代的速度也很快,希望未来我们能够使用Flink机器学习方面的能力,去更好的解决业务的需

  • jQuery - 获取并设置 CSS 类

    jQuery操作CSSjQuery拥有若干进行CSS操作的方法。我们将学习下面这些:addClass()-向被选元素添加一个或多个类removeClass()-从被选元素删除一个或多个类toggleClass()-对被选元素进行添加/删除类的切换操作css()-设置或返回样式属性实例样式表下面的样式表将用于本页的所有例子:.important { font-weight:bold; font-size:xx-large; } .blue { color:blue; }复制jQueryaddClass()方法下面的例子展示如何向不同的元素添加class属性。当然,在添加类时,您也可以选取多个元素:实例$("button").click(function(){ $("h1,h2,p").addClass("blue"); $("div").addClass("important"); });复制您也可以在addClass()方法中规定多个类:实例$("button").

  • 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?

    前两天又有小伙伴私信松哥,问题还是职业规划,Java技术栈路线这种,实际上对于这一类问题我经常不太敢回答,每个人的情况都不太一样,而小伙伴也很少详细介绍自己的情况,大都是一两句话就把问题抛出来了,啥情况都不了解,就要指出一个方向,这实在是太难了。因此今天我想从我学习SpringBoot+Vue这套技术栈的角度,来和大家聊一聊没有人指导,我是如何一步一步建立起自己的技术体系的。线上大家看我经常写文章,线下我其实比较宅,跟人交流比较少,我也很少问别人职业规划或者技术规划这些问题,因为这种学什么的问题,我喜欢自己把握,我不太喜欢被别人牵着走。Romewasnotbuiltinaday,刚开始接触SpringBoot+Vue时,我甚至都没有一个明确的想法,只是觉得该学点什么,不能让时间浪费,没有告诉我SpringBoot要火了,也没有人告诉我Vue要超过React了,都是我自己一直在摸索摸索,一步一步,直到构建起这套技术大厦。SpringBoot先说说SpringBoot吧,三年前差不多也是这个时候,是我第一次接触SpringBoot,那个时候我的正式身份还是一名Android工程师,那段时间

  • PHP设计模式——抽象方法

    点击上方“Lemon黄”关注我哦,不定期原创文,定期好技术文推广分享提供一个用于创建相关或依赖对象的接口,而无需指定其具体类。Dragon公司的业务受到轰炸,而CEO希望特许所有海外分支机构的专营权。他首先要注意的问题是如何确保产品质量。他们不希望特许经营者削减成本和使用低质量的组件。低质量的玩具肯定会破坏Dragon品牌的声誉。因此,CEO希望将业务特许经营,但他们仍然希望每个地方都有工厂来提供组件。开发人员聚集起来,开始集思广益。玩具使用三种类型的组件。发动机,车轮和动叶片。例如,一辆玩具车需要一个发动机和四个轮,而玩具直升机则需要一个动叶片和一个发动机。让我们首先创建一个抽象工厂类,它是所有具体工厂的基础。请注意,抽象工厂实质上由一组工厂方法组成://抽象工厂类 abstractclassComponentsFactory { abstractfunctioncreateEngine();//创建发动机 abstractfunctioncreateWheel();//创建车轮 abstractfunctioncreateRotorBlade();//创建动叶片 } 复制然后创建一

  • 面试官:为什么mysql不建议执行超过3表以上的多表关联查询?

    点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!概述前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-mergejoin)与散列连接(hashjoin),而PG是都支持的,而且mysql是往简单化方向去设计的,如果多个表关联查询(超过3张表)效率上是比不上PG的。下面也对mysql多表关联这个特性简单探讨下~MySQL多表关联查询效率高点还是多次单表查询效率高?A,B两个表数据规模十几万,数据规模都不大,单机MySQL够用了,在单机的基础上要关联两表的数据,先说一个极端情况,A,B两个表都没有索引,并且关联是笛卡尔积,那关联结果会爆炸式增长,可能到亿级别,这个时候网络IO成了瓶颈,这个时候两次十万行结果集的拉去可能远小于1次亿级别的结果集的拉取,那么将关联合并拉到service层做更快。但实际业务中一般不会有这么蠢的行为,一般关联会有连接条件,并且连接条件上会有索引,一般是有一个结果集比较小,拿到这个结果集去另一张表去关联出其它信

  • Dubbo实战案例02【业务实现】

    业务实现添加用户信息1.实现添加业务的服务1.1dubbo-Mapper/** *UsersMapper接口文件 *@authordengp * */ publicinterfaceUsersMapper{ voidinsertUsers(Useruser); }复制<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mappernamespace="com.bobo.mapper.UsersMapper"> <insertid="insertUsers"parameterType="com.bobo.pojo.User"> insertintousers(us

  • ### 0x01 C++ 资源大全

    关于C++框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。标准库C++标准库,包括了STL容器,算法和函数等。C++StandardLibrary:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。StandardTemplateLibrary:标准模板库CPOSIXlibrary:POSIX系统的C标准库规范ISOC++StandardsCommittee:C++标准委员会框架C++通用框架和库ApacheC++StandardLibrary:是一系列算法,容器,迭代器和其他基本组件的集合ASL:Adobe源代码库提供了同行的评审和可移植的C++源代码库。Boost:大量通用C++库的集合。BDE:来自于彭博资讯实验室的开发环境。Cinder:提供专业品质创造性编码的开源开发社区。Cxxomfort:轻量级的,只包含头文件的库,将C++11的一些新特性移植到C++03中。Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。EASTL:EA-STL公共部分ffead-cp

  • Cookie与Session基础知识点

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。 Cookie通过在客户端记录信息确定用户身份 Session通过在服务器端记录信息确定用户身份本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。1.1Cookie机制在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须

  • JS调试工具,万能的Console,你知道还能这样玩吗?

    前言Console在我们开发中应该使用很频繁并且都会用的一个工具,确实好用。但是你真的会用吗?可能有些用法你到现在都还不知道,那么今天我来给各位分享一下Console的比较具体的玩法,助你开发调试更容易。正文 什么是Console? Console是用于显示JS和DOM对象信息的单独窗口。并且向JS中注入1个Console对象,使用该对象可以输出信息到Console窗口中。什么浏览器支持console?很多人可能都知道Chrome和FireFox(FireBug)中都支持Console。而其他浏览器都支持不好。比如IE8自带的开发工具虽然支持Console,但功能比较单调,显示对象的时候都是显示[Object,Object],而且不能点击查看对象里面的属性。IE6、IE7虽然可以安装DeveloperToolbar,但也不支持console。Safari、Opera都支持Console,但使用上都没有FireBug和Chrome的方便。现在firebug推出了firebuglite工具,可以让所有浏览器都支持Console功能,而且使用上和FireBug几乎一样。为什么不直接使用ale

  • iNeuOS工业互联平台,在“智慧”楼宇、园区等领域的应用

    目      录 1.     概述...1 2.     平台演示...2 3.     硬件网关...2 4.     平台接入硬件网关...4  1.     概述      “智慧”一词有点被用烂的味道,所以在标题中打了引号。换个角度,如果为甲方提供强大而低成本的平台,那么也算是一种“智慧”。iNeuOS工业互联网平台完全适用于楼宇、园区等领域的应用,业务方面:安防、消防、设备运维、人员管理等,数据方面:风、水、电、气等相关的开关量和模拟量。数据接入支持传感器与平台直接进行数据交换、支持硬件数据透传模块(例如:RS485转RJ45等)与平台直接进行数据交换、支持硬件网关分布式数据采集后与平台直接进行数据交换;

  • 从毕业到现在6年的学习生活历程-流水账

      毕业6年的工作生活经历 2014-08-12 读书 当年全班覆没依稀还在眼前,一晃已经6年过去了,大家虽然没有上本科,但是在二线以下的城市日子照样过得滋润,可见高考不是决定生死的。自己则上了一个注重动手能力的大专,大专真的是大专,不得不说条件比较艰苦,网络很差整个寝室自己连的电信的2M网只能登陆下QQ,连QQ空间都无法进入更别说查询资料了。再说图书馆:图书馆确实有一点书籍,但是书籍已经是好几年前的,专业性的书籍少之又少,有一两本新书来了很快也就被抢空;再说教科书:大多数是出自本校老之手,系统性确实差了点,学校讲座之类的更是奢侈品了,从这几点资源看来还是能上个好大学最好,不过在有限的资源上,比如学校机房,对于上大学之前从来没有接触过电脑的我来说机房就是大一长待的地方,练习打字,过计算机一级,编程,画图,晚上再上晚自习去啃C#,哈哈,然后就是逛操场,日子过得迷茫又充实。最最忙碌的时间就是每学期最后一个月的实践课,所有课程停下来做专题,一般是老师给一个小项目自己编程,再到后来就是一个大项目全班分两组,由两个PM带领从需求分析到系统设计,到代码实现,到用例编写(那个时候

  • 解决python写入mysql中datetime类型遇到的问题

    解决python写入mysql中datetime类型遇到的问题 刚开始使用python,还不太熟练,遇到一个datetime数据类型的问题: 在mysql数据库中,有一个datetime类型的字段用于存储记录的日期时间值。python程序中有对应的一个datetime变量dt。 现在需要往mysql数据库中添加记录,每次添加时,将datetime型变量dt写入mysql数据库tablename表中exTime字段里。 问题,如何写入?调试时,总是无法写入。 运行环境:windows10python3.6mysql5.6.38 运行结果提示: Processfinishedwithexitcode0     #------看我写的程序------------- importdatetime importpymysql.cursors conn=pymysql.connect(host='127.0.0.1',            &n

  • FaaS,未来的后端服务开发之道

    说FaaS先要说说PaaS 平台即服务(PlatformasaService)是一种云计算服务,提供运算平台与解决方案堆栈即服务。在云计算的典型层级中,平台即服务层介于软件即服务与基础设施即服务之间。平台即服务提供用户能将云基础设施部署与创建至客户端,或者借此获得使用编程语言、程序库与服务。用户不需要管理与控制云基础设施,包含网络、服务器、操作系统或存储,但需要控制上层的应用程序部署与应用托管的环境。 引用自维基百科 简单来说,PaaS就是把计算能力放在线上,你只管写代码就行了,目的也是为了减少后端维护的成本,让开发者更关注到开发本身。国内有SinaAppEngine,国外有Heroku、GoogleAppEngine、AmazonWebServices,但是这类服务被真正用来做产品的并不多,大多是当作开发的试验田跑一下,而且跑起来的成本比独立部署个服务器也差不多,你要理解很多服务的相关性,应用运行时还有提供各种服务的桥接,就造成你需要去理解一大堆东西才能把他们五花大绑到一起,所以这类服务并没有成为真正的主流,更多的是还是用原生的计算能力,比如AmazoneEC2、AWS这类I

  • 大学课程乱写Day2

    程序设计A 周三12到2点交流 浮点数和定点数 和 constexpr #include<bits/stdc++.h> usingnamespacestd; constexprintf(intx){ returnx==1?1:f(x-1)+1; } constexprintN=f(100); intmain(){ } 复制 decltype自动推断表达式类型 #include<bits/stdc++.h> usingnamespacestd; constexprintf(intx){ returnx==1?1:f(x-1)+1; } constexprintN=f(100); template<classT1,classT2> autof(T1x,T2y)->decltype(x+y){ returnx+y; } intmain(){ } 复制

  • Amazon Publisher Studio让产品推广更简单

    Amazon联盟最近推出了PublisherStudio新功能,只要在Amazon联盟网站后台添加一段特定的代码,以后推广所有Amazon产品的时候就不需要再访问AmazonAssociates网站获取该产品的推广链接了。网站安装了PublisherStudio代码后,你可以把页面的任何文字链接到Amazon.com的产品购买页面,甚至可以链接图片。用户通过的你链接访问Amazon.com并购买产品后,你就可以获得相应的 转自:http://www.yihnet.com/2014/04/10/amazon-publisher-studio-product-marketing-even-easier/ https://www.freehao123.com/cj/

  • 搭建pinpoint测试环境

    1下载pinpoint gitclonehttps://github.com/naver/pinpoint.git gitswitch1.8.5   2安装hbase:见上篇随笔   3导入hbase初始数据 [root@zkslave2bin]#./hbaseshell/tmp/init-hbase.txt   4启动pinpointcollector 可能需要改变的配置:         5 启动pinpointweb 修改相关配置        在sts中用嵌入tomcat启动hbaseweb,需要配置一下:       启动后的web界面         6启动示例程序 添加启动参数: -javaagent:D:/study/pinpoint/agent/target/pinpoint-agent-1.8.5/pinpoint-bootstrap-1.8.5.jar-Dpinpoin

  • Azure HDInsight 和 Spark 大数据实战(二)

      HDInsightclusteronLinux   登录Azureportal(https://manage.windowsazure.com) 点击左下角的NEW按钮,然后点击DATASERVICES按钮,点击HDINSIGHT,选择HADOOPONLINUX,如下图所示。   输入集群名称,选择集群大小和账号,设定集群的密码和存储账号,下表是各个参数的含义和配置说明。 Name Value ClusterName Nameofthecluster. ClusterSize Numberofdatanodesyouwanttodeploy.Thedefaultvalueis4.Buttheoptiontouse1or2datanodesisalsoavailablefromthedrop-down.AnynumberofclusternodescanbespecifiedbyusingtheCustomCreateoption.Pricingdetailsonthebillingratesforvariousc

  • 二叉搜索树转换为双向链表

    https://blog.nowcoder.net/n/4fa351e14ee64514babb6742ee023627   题意整理 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 方法一(递归) 1.解题思路 由于二叉搜索树的中序遍历是从小到大依次输出的,所以可以利用中序遍历,在遍历的过程中,逐个改变当前节点的指向。 预先定义一个pre指针,指向当前节点的前一个节点。以及一个head指针指向头节点。 当pre为空时,可以确定当前节点为双向链表的头节点head。其它情况下则可以将pre的后继指向当前节点cur。 遍历过程中,对于每一个cur,都应将其前驱指向pre。同时不断跟新pre。最后返回head即可。 图解展示:  2.代码实现 /** publicclassTreeNode{ intval=0; TreeNodeleft=null; TreeNoderight=null; publicTreeNode(intval){ this.val=val; } } */ publicclassSolution{ //pre记录当前

  • TensorFlow 关闭日志打印

    ubuntu中打开命令行,执行如下指令 vim~/.bashrc复制 进入配置文件后在文件末尾加上: exportTF_CPP_MIN_LOG_LEVEL=2复制 保存退出,再使用下面命令使刚才修改的配置有效 source~/.bashrc复制 当然有关该问题的解决方法不止这一种,但是上述方法还是很方便的一种。 此方法从视频(人工智能实践:Tensorflow笔记)之中总结。  

  • 七.单向链表的:增,删,改,查

    七.单向链表:增,删,改,查 该链表拥有一个头节点,头节点中的数据域用来存储链表的节点个数,指针域指向第一个数据节点。以下是代码。 链表结构体定义: structListNode { intnum; structListNode*next; }; typedefstructListNodeNode;//重命名为Node 复制 创建头节点 Node*head=(Node*)malloc(sizeof(Node));//创建头节点 复制 增加节点函数 :在链表尾部增加一个节点 intAddNode(Node*head) //增加节点 { Node*temp=(Node*)malloc(sizeof(Node));//创建新节点并分配空间 if(temp==NULL)//内存分配失败 { printf("内存分配失败\n"); return-1; } head->num++; //节点数目加1 while(head->next) //先遍历到链表尾节点 { head=head->next; } printf("输入节点数据:");

  • Jquery

    一、选择器:1、基本选择器:跟css很像。1)基本id选择器:#class选择器:.标签选择器:标签名2)组合并列:用,隔开后代:用空格隔开2、过滤选择器1)基本过滤:首尾:首个first,尾个last等于:任意个:eq(索引号)ps:$(".div").eq(1)或是$(".div:eq(1)")不等于:大于是:gt(索引号),小于是:lt(索引号),排除是:not(选择器)ps:$(".div:gt(1)"),$(".div:not(#div1)")奇偶,按索引,从0开始:奇数:odd是把奇数排除了,偶数:even是把偶数排除了2)属性过滤:属性名过滤:[属性名]ps:$(".div:[aaa]")属性的明值对过滤:[属性名=值],[属性名!=值]3)内容过滤文字:contains("字符串")包含了某一段字符串子元素:has("选择器") 二、事件1、常规事件:把js中的事件,on去掉即可复合事件:hover(function(){},function(){}).相当于把mouseover(鼠标移入)mouseout(鼠标移出)合二为一toggle(function(){},fu

相关推荐

推荐阅读