目录
1. 数据读取
1.1. 调用
#调用pandas库
import pandas as pd
1.2. 常用文件读取
CSV文件:以逗号将不同特征值分开的表格文件。
df_origin=pd.read_csv(filepath_or_buffer)
通用文件:支持通用格式文件。
df_origin=pd.read_table(filepath_or_buffer)
Pickle文件
df_origin=pd.read_pickle(filepath_or_buffer)
其他文件:如Excel、Json、Html等。
Reference:pandas.read_pickle — pandas 1.4.3 documentation
2. 数据预处理
2.1. 缺失值处理
#查看缺失值
df_origin.isna()
#删除缺失值
df_nona=df_origin.dropna()
#填补缺失值
#缺失值变为数值
df_nona=df_origin.fillna(0)
#缺失值由字典填补,a、b、c为特征即a特征的缺失值都变为0
df_nona=df_origin.fillna('a':0,'b':1,'c':2)
#缺失值变为同一特征上一对象的记录
df_nona=df_origin.fillna(method='ffill')
Reference: pandas.DataFrame.fillna — pandas 1.4.3 documentation
2.2. 重复值处理
#查看重复值: 表格自上而下第一个会显示False,出现和上面重复的值会显示True
df_nona.duplicated()
#去除重复值
df_nodup=df_nona.drop_duplicates()
#去除特定列有重复值的行
df_nodup=df.nona.drop_duplicates(subset=['Price'])
重复值处理需注意:因为暴力去除重复值会导致数据分布(distribution)变化,因此可选择去除重复值后对重复值数据附加权重(Weight)。比如没记录去除了18个重复值,则带上原本自身的一个,Weight= 19。
Reference:
2.3.特征编码
由于机器只能识别数值,因此需要将标称型特征categorical feature(String或其他类型)变为数值类型interger codes。
#OrdinalEncoder是将特征值bian为0到n_categories - 1的范围内
enc = preprocessing.OrdinalEncoder()
enc.fit(df_nudup.X) #X是特征名
enc
由于OrdinalEncoder将非numerical数据变为有序的numerical,会影响模型的建立,因此可使用one-of-K,又称为独热码或dummy encoding。
将n个特征值变为长度为n的二进制特征向量,每个值只有一位是1,其余都是0
enc = preprocessing.OneHotEncoder()
enc.fit(df_nodup.X)
df_nodup
#可查看转换值
enc.transform([['female', 'from US', 'uses Safari'],
... ['male', 'from Europe', 'uses Safari']]).toarray()
array([[1., 0., 0., 1., 0., 1.],
[0., 1., 1., 0., 0., 1.]])
Ref: https://www.sklearncn.cn/40/
2.4. 降维(可选)
对于2维数据,我们创建新的2维空间,让原本数据点都落在新的其中一个特征向量上,那么另一个新空间特征向量的特征值为0,则该特征向量失去意义,2维向量变为1维向量。N维也是同样的道理。
由于降维会将原本的多个特征进行合并,所以并不合适探索特征和标签之间关系的模型(如线性回归)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca=pca.fit(df_nodup)
df_dr=transform(df_nodup)#获得新的矩阵
print(pca.explained_variance_ratio_)
print(pca.singular_values_)
2.5. 特征缩放
将所有特征缩放到【0,1】或者【-1,1】,使其均值为0,方差为1。
#特征缩放
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train) # Don’t cheat - fit only on training data
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test) # apply same transformation to test data
2.6. 其他关键函数
#添加行,df2是相同特征的列表
df_nodup.append(df2)
#数组(series)的组合行是concat
s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])
pd.concat([s1, s2])
3. 建立模型
3.1. 线性模型
3.1.1. 最小二乘法
拟合线性模型,并使得误差平方和最小。
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit (X,Y)
reg.coef_
>>> array([ 0.5, 0.5])
3.1.2. Ridge岭回归
对系数的大小施加惩罚来解决普通最小二乘法的过拟合问题。
from sklearn import linear_model
reg = linear_model.Ridge (alpha = .5)
reg.fit (X,Y)
3.1.3. Lasso
与Ridge的区别在于是在常规Loss Function后面加一个L1范式。
from sklearn import linear_model
reg = linear_model.Lasso(alpha = 0.1)
reg.fit(X,Y)
reg.predict(test_X)
3.1.4. BayesianRidge贝叶斯回归
贝叶斯回归可以用于在预估阶段的参数正则化。
from sklearn import linear_model
reg = linear_model.BayesianRidge()
reg.fit(X, Y)
3.1.5. logistic逻辑回归
3.2. 支持向量机(SVM)
适用于高维空间
#分类问题
from sklearn import svm
clf = svm.SVC(gamma='scale')
clf.fit(X, y)
#回归问题
from sklearn import svm
clf = svm.SVR()
clf.fit(X, y)
3.3. 随机梯度下降 SGD
适用于大规模和稀疏的机器学习问题,强烈建议将所有特征缩放到【0,1】或者【-1,1】,使其均值为0,方差为1。
#特征缩放
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train) # Don’t cheat - fit only on training data
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test) # apply same transformation to test data
from sklearn.linear_model import SGDClassifier
clf = SGDClassifier(loss="hinge", penalty="l2")
clf.fit(X, y)
3.4. 最近邻
from sklearn.neighbors import NearestNeighbors
import numpy as np
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)
3.5. 高斯朴素贝叶斯
特征的可能性(概率)假设为高斯分布。
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
3.6. 决策树
#分类
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
clf.predict(X)
clf.predict_proba(X)#样本中Y各分类的概率
#回归
from sklearn import tree
clf = tree.DecisionTreeRegressor()
clf = clf.fit(X, y)
clf.predict(test_X)
3.7. 集成方法
3.7.1. Bagging
from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
bagging = BaggingClassifier(KNeighborsClassifier(),
... max_samples=0.5, max_features=0.5)
3.7.2. 随机森林
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)
3.7.3. 极限随机树
每个节点的区分阈值随机生成,并选取最佳的阈值作为分割规则。
效果:能够减少一点模型的方差,代价则是略微地增大偏差
from sklearn.model_selection import cross_val_score
>>> from sklearn.datasets import make_blobs
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.tree import DecisionTreeClassifier
>>> X, y = make_blobs(n_samples=10000, n_features=10, centers=100,
... random_state=0)
>>> clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,
... random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores.mean()
0.98...
>>> clf = RandomForestClassifier(n_estimators=10, max_depth=None,
... min_samples_split=2, random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores.mean()
0.999...
>>> clf = ExtraTreesClassifier(n_estimators=10, max_depth=None,
... min_samples_split=2, random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> scores.mean() > 0.999
True