数据分析Python综合流程

目录

1. 数据读取

1.1. 调用

1.2. 常用文件读取

2. 数据预处理

2.1. 缺失值处理

2.2. 重复值处理

 2.3.特征编码

 2.4. 降维(可选)

2.5. 特征缩放

2.6. 其他关键函数

3. 建立模型

3.1. 线性模型

3.1.1. 最小二乘法

3.1.2. Ridge岭回归

 3.1.3. Lasso

3.1.4. BayesianRidge贝叶斯回归

3.1.5. logistic逻辑回归

3.2. 支持向量机(SVM)

3.3. 随机梯度下降 SGD 


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:

pandas.DataFrame.drop_duplicates — pandas 1.4.3 documentationhttps://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html

 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

猜你喜欢

转载自blog.csdn.net/xzhu4571/article/details/125490416