《python机器学习》读书笔记

《python机器学习》, Abhishek Vijayvargia著, 宋格格译, 人民邮电出版社.

break, continue

这本书有我见过最好的讲breakcontinue的区别的地方:

break

break是跳出循环。

1
2
3
4
5
6
i = 1
while i<5:
print(i**2)
i = i+1
if(i==3):
break

结果输出的是1和4,每当i的值为3,将会执行中断语句并跳出循环。

continue

continue用于跳出循环的其余部分,并在下一次迭代中将控件传递到循环的顶部。

1
2
3
4
5
6
i = 1
while i<5:
i = i+1
if(i==3):
continue
print(i**3)

结果输出1、4、16和25,当i值为3,他讲跳过剩余的代码并将控制转移到一下次迭代。

读取文件

用read读取文件

1
2
f = open('my_file.txt','r')
file_content = f.read()

读取文件后,关闭用

1
f.close()

用read写入文件

1
2
3
f = open('my_file.txt','w')
f.write('what is this?')
f.close()

用with读取或写入

1
2
with open('my_file.txt','w') as f:
print(f.read())

用pandas读取或写入

1
2
3
csv_file = pandas.read_csv('something.csv')
xls_file = pandas.read_excel('something.xls')
json_file = pandas.read_json('something.json')

常见数据清洗操作

1
就记axis=1是跨列,axis=0是跨行。

删掉所有有空值的行

product_df.dropna(axis=0)

删掉…列

product_df.dropna(axis=1)

删掉所有具有小于k个空值的行

product_df.dropna(axis=0,thresh=5)

删除全部为空的行

product_df.dropna(axis=0,how='all')

用1替换0

product_df.replace(0,1)

用0填充na

product_df.fillna(0)

从每个sellername那里计算成本的平均值

product_df['price'].groupby(product_df['SellerName']).mean()

降序排序

product_df.sort_values(by='price',ascending=False)

lambda函数

smallText =lambda x: x.lower()

然后再对dataframe的任何列(shippinglocation)应用这个函数

product_df['ShippingLocation'].apply(smallText)

返回所有费用的总和

product_df['cost'].apply(sum)

map可以迭代,将每个项目的费用降低50

product_df['cost'].apply(lambda x: x-50)

数值特征分箱

将数值特征进行分箱处理,可以通过对数值特征进行分箱处理来固定来固定类别,下面将age转换为4个类别

1
2
3
4
5
6
7
8
9
10
from sklearn import preprocessing

data = {'age': [28,27,31,31,15,41,61,26,85,9,88,51,26,52,19]}
age_frame = pandas.DataFrame(data)

bins = [0, 20, 40, 60, 100]
group_names = ['Less Than 20 years', '20 to 40 years', '40 to 60 years', '60+ years']

age_frame['categories'] = pandas.cut(age_frame['age'], bins, labels=group_names)
age_frame

分类变量转换为数值

对每个类别分配一个数字,将分类变量转换为数值型特征。labelencoder

1
2
3
4
from sklearn import preprocessing

encoder = preprocessing.LabelEncoder()
encoder.fit_transform(["Delhi", "Pune", "Mumbai", "Delhi"])

虚拟变量

1
dummy_frame = pandas.get_dummies(age_frame.categories)

提取日期特征的信息

创建个数据先

1
2
3
4
5
import pandas
startDate = '2017-07-06'
endDate = '2017-12-18'
Dates = pandas.DataFrame(pandas.date_range(startDate, endDate),columns=['Dates'])
Dates
Dates
0    2017-07-06
1    2017-07-07
2    2017-07-08
3    2017-07-09
4    2017-07-10
5    2017-07-11
6    2017-07-12
7    2017-07-13
8    2017-07-14
9    2017-07-15

is_busyday用于检查是否是工作日,得到的weekmask是一个由0和1组成的字符串,1表示从星期一开始的工作日。

类似的还有is_winter is_morning is_summer

1
2
3
4
5
6
import numpy
Dates['day'] = Dates['Dates'].map(lambda x:x.day)
Dates['month'] = Dates['Dates'].map(lambda x:x.month)
Dates['da_of_week'] = Dates['Dates'].map(lambda x:x.weekday_name)
Dates['is_weekend'] = Dates['Dates'].map(lambda x:numpy.is_busday(x, weekmask='1111100' ))
Dates
Dates    day    month    da_of_week    is_weekend
0    2017-07-06    6    7    Thursday    True
1    2017-07-07    7    7    Friday    True
2    2017-07-08    8    7    Saturday    False
3    2017-07-09    9    7    Sunday    False
4    2017-07-10    10    7    Monday    True
5    2017-07-11    11    7    Tuesday    True
6    2017-07-12    12    7    Wednesday    True
7    2017-07-13    13    7    Thursday    True
8    2017-07-14    14    7    Friday    True
9    2017-07-15    15    7    Saturday    False
10    2017-07-16    16    7    Sunday    False

PCA

1
2
3
from sklearn.decomposition import PCA
pca = PCA()
pca.fit_transform(word_frame)

得到:

array([[  5.36362256e-01,  -7.07106781e-01,   7.51836139e-17,
          5.09893376e-17],
       [ -5.36362256e-01,  -6.96319551e-16,  -5.90984029e-01,
          5.09893376e-17],
       [ -5.36362256e-01,  -7.66186799e-16,   5.90984029e-01,
          5.09893376e-17],
       [  5.36362256e-01,   7.07106781e-01,   3.49246184e-17,
          5.09893376e-17]])

用于特征选择的贪心算法

他这写的不如全子集算法好理解..
贪心算法是基于可获得的特征集找到最佳特征的办法,在列表中添加这个特征,并从可获取的列表中删除这个特征。

1
2
3
4
5
6
7
8
特征值 = 空
可获取的特征集合 = 所有特征
for i = 1 to 特征数量:
利用当前最佳特征和特征集对模型拟合
从可获取列表中删除选定的特征并将其放入特征集中
使用交叉验证计算误差
选择具有最小误差的特征集
训练误差将在每一步中得到下降,必须使用验证集确定停止点。

这种科普类的书真是有点鸡肋 深不深浅不浅的

哎好烦躁 不学了