天天看点

Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别

XGBoost的特点

1、XGBoost的损失函数

往期文章:ML之XGBoost:XGBoost算法模型(相关配图)的简介(XGBoost并行处理)、关键思路、代码实现(目标函数/评价函数)、安装、使用方法、案例应用之详细攻略

Python语言基础知识点考察

1、可变不可变的数据类型

python中主要有6种标准数据类型,分为可变和不可变两类。

不可变类型:该数据类型对象所指定内存中的值不可以被改变。

(1)、在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值。

可变类型:该数据类型的对象所指定的地址上面的值可以被改变。

(1)、变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为,不会重新开辟空间。

不可变类型—非嵌套数据 可变类型—可嵌套数据

Number数字

String字符串

Tuple元组

List列表

Dictionary字典

Set集合

结合拷贝

例子:a = 521

copy.copy 和 copy.deepcopy 没有区别,都会开辟新空间存储数据。

例子:a = [[521], {'521':521}]

copy.copy没有办法保证数据的独立性,拷贝第一层的引用。

copy.deepcopy完全拷贝所有的层级,都会有自己的空间。

2、赋值、浅拷贝、深拷贝区别

       首先,需要明确一点,浅拷贝和深拷贝之间的区别只适用于容器对象(包含其他对象的对象,如列表或类实例)。对于非容器对象没有区别,都是对象拷贝,相当于重新赋值,生成一个新的对象。

敲重点,面试时,下边三句回答即可!

简单的来说,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存。

深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存。

应用copy.copy浅拷贝、copy.deepcopy深拷贝功能的时候,会根据当前拷贝的数据类型,可变类型和不可变类型有不同的处理方式。

(1)、对于不可变对象(数字、字符串、元祖),浅拷贝和深拷贝是没有区别的。

(2)、对于可变对象(列表、字典、集合),浅拷贝第一次层引用,而深拷贝是完全拷贝。

1、赋值—对象赋值实际上是简单的对象引用

比较简单,赋值就是对物体进行贴标签操作,作用于同一物体。

赋值:值不变,地址不变;

copy浅拷贝和deepcopy深拷贝:值相等,地址不相等;

2、浅拷贝—只拷贝父对象

A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

(1)、浅拷贝是指拷贝的只是原对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。

(2)、浅拷贝是指把存放变量的地址值传给被赋值,最后两个变量引用了同一份地址。

浅拷贝会创建一个新的容器对象(compound object)。

对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)。

常见的浅拷贝操作有:

使用切片操作[:]

使用工厂函数(如list/dir/set)

copy模块的copy()方法

1、浅拷贝的代码实现

import copy

b=copy.copy(a)

3、深拷贝—完全拷贝父对象及其子对象

A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

(1)、深拷贝是指被赋值的变量开辟了另一块地址用来存放要赋值的变量的值(内容)。

1、深拷贝的应用: 主要是希望在改变新的数组(对象)的时候,不改变原数组(对象),即原来的东西还要使用。

1)深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object)

2)和浅拷贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象

常见的深拷贝操作有:

copy.deepcopy

2、深拷贝的代码实现

b=copy.deepcopy(a)