Làm cách nào để bạn phân cụm dữ liệu phân loại trong python?

Ghi chú trước Nếu bạn là nhà phân tích dữ liệu, nhà khoa học dữ liệu ở giai đoạn đầu hoặc có tham vọng, hoặc chỉ thích làm việc với phân cụm số thì đây là một chủ đề tuyệt vời để bắt đầu. Trên thực tế, tôi đã tích cực hướng sự nghiệp sớm và nhà khoa học dữ liệu mới vào chủ đề này ngay từ đầu trong quá trình đào tạo của họ và tiếp tục chu kỳ phát triển chuyên nghiệp

Học cách áp dụng và thực hiện phân tích phân cụm chính xác sẽ đưa bạn đến với nhiều nguyên tắc cốt lõi của phân tích dữ liệu, toán học, học máy và khoa học tính toán. Từ việc tìm hiểu về các kiểu dữ liệu và hình học, ma trận nhầm lẫn, đến áp dụng thuật toán lặp và tính toán hiệu quả trên dữ liệu lớn. Những khái niệm cơ bản này xuất hiện trong hầu hết các lĩnh vực khác của khoa học dữ liệu và học máy. Chẳng hạn, ma trận khoảng cách cụm làm cơ sở và, về mặt toán học, gần giống với cấu trúc dữ liệu biểu đồ được sử dụng trong các mạng thần kinh đồ thị học sâu ở mũi nhọn của nghiên cứu trí tuệ nhân tạo. Vì vậy, nếu bạn mới bắt đầu thì đừng bỏ qua và hãy đọc tiếp bất kể trình độ của bạn là bao nhiêu. Tất cả chúng ta đều phải bắt đầu từ đâu đó và đây là một nơi rất tốt

1. Giới thiệu

Phân tích cụm là nhiệm vụ nhóm các đối tượng trong một quần thể sao cho các đối tượng trong cùng một nhóm hoặc cụm giống nhau hơn so với các đối tượng trong các cụm khác. Phân cụm là một hình thức học tập không giám sát vì số lượng, kích thước và phân phối của các cụm không được biết trước. Phân cụm có thể được áp dụng cho nhiều vấn đề và lĩnh vực khác nhau bao gồm. phân khúc khách hàng để bán lẻ và tiếp thị, xác định các nhóm rủi ro cao hơn hoặc thấp hơn trong danh mục bảo hiểm, để tìm các hệ thống bão trên Jupyter và thậm chí xác định các thiên hà ở rất xa

Nhiều bộ dữ liệu trong thế giới thực bao gồm các kết hợp số, thứ tự [e. g. nhỏ, trung bình, lớn] và danh nghĩa [e. g. Pháp, Trung Quốc, Ấn Độ] tính năng dữ liệu. Tuy nhiên, nhiều thuật toán và hướng dẫn phân cụm phổ biến như K-means chỉ phù hợp với các loại dữ liệu số. Bài viết này được viết dựa trên giả định rằng các phương pháp này quen thuộc - nhưng nếu không thì Sklearn cung cấp một bài đánh giá tuyệt vời về các phương pháp này để nhanh chóng làm mới lại

Bài viết này tìm cách cung cấp đánh giá về các phương pháp và ứng dụng thực tế để phân cụm tập dữ liệu với các kiểu dữ liệu hỗn hợp

1. 1 mục tiêu

Để đánh giá các phương pháp phân cụm các tập dữ liệu chứa nhiều kiểu dữ liệu khác nhau

1. 2 mục tiêu

  1. Để nghiên cứu và xem xét các kỹ thuật phân cụm cho các bộ dữ liệu kiểu dữ liệu hỗn hợp
  2. Để nghiên cứu và xem xét các chiến lược kỹ thuật và mã hóa tính năng
  3. Để áp dụng và xem xét các phương pháp phân cụm trên tập dữ liệu thử nghiệm
2. nghiên cứu điển hình. yêu cầu bảo hiểm ô tô

Bộ dữ liệu yêu cầu bồi thường bảo hiểm ô tô của California chứa 8631 quan sát với hai biến dự đoán phụ thuộc Số tiền yêu cầu bồi thường đã xảy ra và Số tiền yêu cầu và 23 biến dự đoán độc lập. Từ điển dữ liệu mô tả từng biến bao gồm

  • Bluebook = giá trị xe bán lại
  • MVR_PTS = MotorVehicleRecordPoints [MVR] nêu chi tiết lịch sử lái xe trước đây của một cá nhân cho thấy các vi phạm và tai nạn trong một khoảng thời gian nhất định
  • TIF = Thời gian có hiệu lực / thời gian tồn tại của khách hàng
  • YOJ = số năm làm việc
  • CLM_FRQ = # yêu cầu bồi thường trong 5 năm qua
  • OLDCLAIM = tổng số tiền yêu cầu bồi thường trong 5 năm qua

    • https. //cộng đồng. thay thế. com/t5/Alteryx-Designer-Discussions/Insurance-Datasets/td-p/440035
    • https. //rpub. com/data_feelings/msda_data621_hw4
    • https. //rdrr. io/cran/HDtweedie/man/auto. html
    • https. //cran. dự án r. org/web/gói/dữ liệu bảo hiểm/dữ liệu bảo hiểm. pdf

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
00

3. Phương pháp

3. 1 Tiền xử lý dữ liệu

Áp dụng quy trình xử lý để sửa và xử lý các giá trị sai, đồng thời đổi tên các trường và giá trị để làm việc với dữ liệu dễ dàng hơn. Bao gồm

  • xóa hoặc điền giá trị null
  • thả các cột không liên quan
  • rút ngắn tên giá trị phân loại

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
01

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
02

3. 2 Phân tích dữ liệu thăm dò

Biểu đồ tính năng phân loại

Hiển thị bên dưới là biểu đồ của từng tính năng phân loại. Điều này minh họa cả số lượng và tần suất của từng danh mục trong tập dữ liệu

Các yêu cầu được phân phối như thế nào giữa các tính năng phân loại?

Như ở trên, các biểu đồ thanh một lần nữa minh họa từng tính năng và giá trị phân loại, nhưng giờ đây cũng cho biết tỷ lệ khiếu nại được phân bổ như thế nào đối với từng giá trị phân loại. Ví dụ: CAR_USE thương mại có tỷ lệ khiếu nại tương đối cao hơn so với sử dụng ô tô cá nhân

3. 3 Phân cụm

Nhớ lại rằng mỗi thuật toán phân cụm là một nỗ lực để tạo các nhóm dữ liệu tự nhiên. Ở cấp độ cao, các thuật toán phân cụm đạt được điều này bằng cách sử dụng thước đo độ tương tự hoặc khoảng cách giữa từng cặp điểm dữ liệu, giữa các nhóm và phân vùng của các điểm hoặc giữa các điểm và nhóm với một điểm trung tâm đại diện [i. e. Tâm]. Vì vậy, mặc dù các triển khai thuật toán thực tế để đạt được điều này khác nhau, nhưng về bản chất, chúng dựa trên nguyên tắc khoảng cách đơn giản này. Điều này được minh họa khá độc đáo trong hình minh họa bên dưới cho thấy tập dữ liệu có 3 cụm và phân vùng cụm lặp a-f bằng cách cập nhật các điểm trọng tâm [Chen 2018]. Ở đây, các cụm được hình thành bằng cách đo khoảng cách giữa mỗi điểm dữ liệu [điền đặc] và điểm centoid đại diện [điền rỗng]

Bởi vì các thuật toán phân cụm sử dụng cả khái niệm khoảng cách này, điều quan trọng là phải xem xét cả hai

  • Đo khoảng cách. Khoảng cách hoặc thước đo “độ tương tự” được sử dụng
  • Kỹ thuật tính năng. Bản chất của dữ liệu của chúng tôi và cách dữ liệu được trình bày trong thuật toán phân cụm

3. 3. 1 Số đo khoảng cách

Dưới đây là một số biện pháp khoảng cách phổ biến được sử dụng để phân cụm. Hiệu quả tính toán rất quan trọng ở đây vì mỗi tính năng dữ liệu giới thiệu một thứ nguyên bổ sung. Để phân cụm, theo định nghĩa, chúng ta thường có nhiều tính năng để hiểu và do đó hiệu quả của phép tính trong không gian nhiều chiều là rất quan trọng

là hiệu số tuyệt đối của vị trí của chúng trong không gian Euclide. Khoảng cách có thể bằng 0 hoặc lấy bất kỳ số thực dương nào. Nó được đưa ra bởi tổng bình phương gốc của sự khác biệt giữa mỗi cặp điểm [p, q]. Và chúng ta có thể thấy rằng đối với các kích thước lớn, chúng ta chỉ cần thêm khoảng cách

\[d_n[p,q] = \sqrt{[p_1-q_1]^2+[p_2-q_2]^2. +[p_n-q_n]^2}\]

Khoảng cách Manhattan lại là tổng của chênh lệch số tuyệt đối giữa hai điểm trong không gian, nhưng sử dụng tọa độ cartesian. Trong khi khoảng cách Euclide là đường thẳng “đường chim bay” theo định lý Pythagoras, thì Manhattan lấy khoảng cách là tổng của các vectơ đường thẳng [p,q]

\[d_n[p,q] = \sum_{i=1}^{n}. {[p_n-q_n]}. \]

Hình ảnh này minh họa các ví dụ cho. a] Khoảng cách không gian Euclide, b] Khoảng cách Manhattan trong không gian tọa độ Descartes và c] cả hai đều có đường màu lục biểu thị đường Euclide, trong khi các đường màu xanh lam, đỏ và vàng đi theo đường Descartes với khoảng cách Manhattan. Điều này minh họa cách các kết quả phân cụm có thể bị ảnh hưởng bởi các biện pháp khoảng cách được áp dụng và tùy thuộc vào việc các tính năng dữ liệu là giá trị thực và số hay giá trị thứ tự và phân loại rời rạc. Ngoài ra, có lẽ điều này cũng minh họa cho bạn cách thức và lý do tại sao hình học và khoảng cách lại quan trọng trong các lĩnh vực khác chẳng hạn như bài toán đường đi ngắn nhất.

Có nhiều thước đo khoảng cách [e. g. xem các slide này]. Khoảng cách Minkowski chẳng hạn, là tổng quát của cả khoảng cách Euclide và khoảng cách Manhattan. scipy có chức năng khoảng cách cặp đôi thuận tiện

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
03 áp dụng nhiều biện pháp phổ biến nhất

Ví dụ.
______004

Ngoài ra còn có các biện pháp khoảng cách lai. Trong nghiên cứu điển hình của chúng tôi và chủ đề của bài viết này, dữ liệu chứa hỗn hợp các tính năng với các loại dữ liệu khác nhau và điều này yêu cầu một biện pháp như vậy

Khoảng cách Gower [1971] là một thước đo kết hợp xử lý cả dữ liệu liên tục và dữ liệu phân loại

  • Nếu tính năng dữ liệu là liên tục hoặc theo thứ tự, Manhattan hoặc Manhattan theo thứ tự được xếp hạng sẽ được áp dụng tương ứng
  • Nếu tính năng dữ liệu là phân loại, thì một hệ số được áp dụng. DICE được giải thích ở đây. Tuy nhiên, nếu bạn đã quen thuộc với hệ số Jaccard và hoặc phân loại nhị phân [e. g. Tích cực Đúng TP và Sai Tích cực FP, v.v.] và ma trận nhầm lẫn thì DICE sẽ trở nên quen thuộc như
\[Xúc xắc = \frac{2. X \cap Y. }{. X. +. Y. } = \frac{2TP}{2TP+FP+FN}\]

Khoảng cách Gower của một cặp điểm $G[p,q]$ khi đó là

\[G_n[p,q] = \frac{\sum_{i=1}^{n}W_{pqk}S_{pqk}}{\sum_{i=1}^{n}W_{pqk}}\

trong đó $S_{pqk}$ là giá trị Manhattan hoặc DICE cho tính năng $k$ và $W_{pqk}$ là 1 hoặc 0 nếu tính năng $k$ hợp lệ. Đó là tổng điểm tính năng chia cho tổng trọng số tính năng

3. 3. 2 Kỹ thuật tính năng

Với sự hiểu biết được cải thiện này về các phép đo khoảng cách phân cụm, giờ đây rõ ràng là quy mô của các tính năng dữ liệu của chúng tôi cũng quan trọng không kém. Ví dụ, hãy tưởng tượng chúng ta đang nhóm các ô tô theo đặc điểm hiệu suất và trọng lượng của chúng

  • Xe A chạy 0-60 mph trong 3. 5 giây và có khối lượng 3000 KG
  • Xe B chạy 0-60 mph trong 5. 5 giây và có khối lượng 5000 KG

Khoảng cách tính năng giữa Xe A và B là 2. 0 giây và 2000 KG. Do đó, khoảng cách 2000 đơn vị của chúng ta đối với khối lượng là các bậc độ lớn lớn hơn 2. 0 giây cho 0-60 dặm / giờ. Việc phân cụm dữ liệu ở dạng này sẽ mang lại kết quả thiên về các tính năng phạm vi cao [xem thêm ví dụ trong các câu trả lời StackOverflow 1,2,3 này]. Khi sử dụng bất kỳ thuật toán nào tính toán khoảng cách hoặc giả sử dữ liệu được phân phối bình thường, hãy chia tỷ lệ các tính năng của bạn 4

Đối với các bộ dữ liệu có các loại dữ liệu hỗn hợp, hãy cân nhắc rằng bạn đã chia tỷ lệ tất cả các tính năng thành từ 0-1. Điều này sẽ đảm bảo các phép đo khoảng cách được áp dụng thống nhất cho từng đối tượng địa lý. Các tính năng số sẽ có khoảng cách với tối thiểu 0-1 và số thực giữa e. g. 0. 1,0. 2,0. 5,…0. 99. Trong khi khoảng cách cho các tính năng phân loại là các giá trị của 0 hoặc 1. Đối với khối lượng KG trong ví dụ ô tô ở trên, điều này vẫn có thể dẫn đến sự sai lệch trong việc hình thành các cụm đối với các nhóm đặc điểm phân loại vì khoảng cách của chúng luôn là giá trị tối thiểu-tối đa là 0 hoặc 1

Lựa chọn các phép biến đổi và chia tỷ lệ thích hợp để áp dụng là một phần khoa học và một phần nghệ thuật. Thường có một số chiến lược có thể phù hợp và phải được áp dụng cũng như đánh giá liên quan đến bối cảnh thách thức hiện tại, dữ liệu và lĩnh vực của nó. Điều quan trọng, bất kể chiến lược nào được áp dụng, tất cả các tính năng trong tập dữ liệu cuối cùng được sử dụng để phân cụm dữ liệu phải ở cùng một tỷ lệ để mỗi tính năng được xử lý như nhau theo chỉ số khoảng cách

Các loại dữ liệu khác nhau và cách xử lý chúng

Đây là hai bài báo và số liệu xuất sắc tìm hiểu sâu hơn về các loại dữ liệu [trái] và kỹ thuật mã hóa [phải]

Tóm lại, đây là những

tính năng số. các tính năng liên tục và khoảng thời gian như khối lượng, tuổi, tốc độ, độ sáng, ma sát

  • Sử dụng tỷ lệ và tỷ lệ phần trăm
  • bình thường hóa [tôi. e. chuẩn hóa các giá trị theo tỷ lệ 0-1]
  • tiêu chuẩn hóa [tôi. e. giá trị có bao nhiêu độ lệch chuẩn so với giá trị trung bình của mẫu]
  • chuyển đổi [tôi. e. chuyển đổi nhật ký]

Các tính năng phân loại danh nghĩa. Các giá trị đối xứng danh nghĩa hoặc nhị phân không có thứ tự trong đó các kết quả có tầm quan trọng như nhau [e. g. Nam hay nữ]

  • Mã hóa một lần và giả [i. e. tạo chỉ báo nhị phân của từng danh mục]
  • Nếu xử lý một tính năng có cardinality cao >15, hãy cố gắng giảm kích thước bằng kỹ thuật tính năng hoặc áp dụng mã hóa nhị phân hoặc mã băm

Các tính năng phân loại thông thường. Các giá trị bất đối xứng thứ tự hoặc nhị phân được sắp xếp, trong đó các kết quả không có tầm quan trọng như nhau

Ví dụ. xem xét tính năng phân loại thứ tự cho các huy chương olympic được mã hóa thành Đồng=1, Bạc=2, Vàng=3. Ở đây đồng [= 1 * 1], bạc [= 2 * đồng], vàng [= 3 * đồng]. Chênh lệch giữa Vàng-Đồng [=3-1=2] lớn hơn giữa Vàng và Bạc [=3-2=1] kém hơn. Rõ ràng đây là thứ tự vì mỗi danh mục có thứ hạng và thang đo tương đối so với từng danh mục khác

  • Mã hóa nhãn với chuẩn hóa 0-1 nếu các giá trị có tầm quan trọng như nhau và có tỷ lệ tăng dần
  • Xếp hạng các giá trị với chuẩn hóa 0-1, một lần nữa nếu các giá trị có tỷ lệ tăng dần về mức độ quan trọng như nhau
  • Nếu có một biến mục tiêu nhị phân trong tập dữ liệu [e. g. sự kiện, chẩn đoán y tế, loại mống mắt], người ta cũng có thể gán tần số, tỷ lệ lẻ hoặc trọng số của bằng chứng cho mỗi lớp thứ tự

Cho đến nay, dữ liệu thứ tự là khó khăn nhất để xử lý. Có nhiều tranh luận giữa những người theo chủ nghĩa thuần túy toán học, nhà thống kê và những người thực hành dữ liệu khác về thời tiết để coi dữ liệu thứ tự là định tính hoặc định lượng [xem tại đây]

GHI CHÚ. Đo khoảng cách và mã hóa có lẽ là phần khó nhất để phân cụm dữ liệu. Theo ý kiến ​​​​của tác giả này, đặc biệt đối với các tính năng phân loại và thứ tự, dữ liệu nên được xử lý thận trọng và các học viên nên thử và đánh giá các chiến lược mã hóa và kỹ thuật tính năng khác nhau dựa trên sự hiểu biết của họ về dữ liệu và miền của nó. Khuyến nghị khác của tôi là trước tiên hãy thử và kiểm tra các chiến lược khác nhau với các tập dữ liệu nhỏ hơn và những chiến lược mà bạn có hiểu biết hợp lý về những gì các cụm NÊN là [Iris, Titanic]. Xác thực cách tiếp cận của bạn trên những dữ liệu này, sau đó áp dụng cho dữ liệu của riêng bạn và xây dựng độ phức tạp từ đó quyết định nơi tập trung nhiều hơn vào việc điều chỉnh quy trình mã hóa. Dưới đây là một số liên kết hữu ích hơn

  • Các biến đối xứng và bất đối xứng nhị phân
  • chuyển đổi kiểu dữ liệu trong phân cụm
  • Chuẩn hóa so với Chuẩn hóa - Phân tích định lượng
  • Bình thường hóa vs Tiêu chuẩn hóa

3. 3. 3 phương pháp phân cụm

Cũng có những cân nhắc cho thuật toán phân cụm được áp dụng. Những điều này sẽ được giới thiệu và thảo luận về ứng dụng cho bộ dữ liệu nghiên cứu trường hợp trong phần kết quả

4. Kết quả

4. 1 Kỹ thuật tính năng

Chia tỷ lệ các tính năng số

Bên dưới, cả tỷ lệ Tiêu chuẩn và MinMax đều được áp dụng để hiển thị cách dữ liệu được chuyển đổi. Dữ liệu được chia tỷ lệ MinMax được sử dụng trong tương lai

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
05

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
06

MVR_PTSYOJTIFCAR_AGEAGETRAVTIMECLM_AMTBLUEBOOKOLDCLAIMHOME_VALINCOME0311. 01118. 060. 0140. 014230. 04461. 00. 067349. 01011. 011. 043. 0220. 014940. 00. 0257252. 091449. 0

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
07

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
08

MVR_PTSYOJTIFCAR_AGEAGETRAVTIMECLM_AMTBLUEBOOKOLDCLAIMHOME_VALINCOME00. 5974530. 1315521. 3795671. 7531031. 762458-1. 223551-0. 319843-0. 1696560. 048899-1. 1185020. 1904391-0. 7921370. 131552-1. 053171-1. 318759-0. 213574-0. 719421-0. 319843-0. 085417-0. 4619380. 8536710. 690195

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
09

MVR_PTSYOJTIFCAR_AGEAGETRAVTIMECLM_AMTBLUEBOOKOLDCLAIMHOME_VALINCOME00. 2307690. 4782610. 4166670. 6774190. 6769230. 0656930. 00. 1865470. 0782120. 0000000. 18349710. 0000000. 4782610. 0000000. 1290320. 4153850. 1240880. 00. 1969520. 0000000. 2905880. 249159

Chia tỷ lệ các tính năng phân loại. thứ tự và danh nghĩa

Kiểm tra các ô trên EDA của chúng tôi trong phần 3. 2, chúng tôi có thể muốn kết hợp một số lớp có tần số mục tiêu thấp và hoặc lực lượng cao. đó là

  • TRẺ EM. thu gọn >= 2 vào danh mục duy nhất
  • HOMEKIDS. thu gọn >= 4 vào danh mục duy nhất

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
10

Hãy nhớ rằng, các tính năng danh nghĩa là các phân loại với các giá trị không có thứ tự. Ở đây, chúng ta có thể lập luận rằng GIÁO DỤC và NGHỀ NGHIỆP là danh nghĩa [i. e. không có thứ tự] hoặc thứ tự [i. e. ra lệnh]. Đây có thể là một cuộc tranh luận khá…. nhưng có một lập luận tốt để coi GIÁO DỤC là thứ tự và NGHỀ NGHIỆP là một danh nghĩa rõ ràng. KIDSDRIV và HOMEKIDS cũng có thể được coi là có thứ tự và tăng dần theo tỷ lệ, tuy nhiên, những điều chỉnh chúng ta vừa thực hiện đối với các giá trị trên không đối xứng theo tỷ lệ. Điều này có thể ổn mặc dù có rất ít dữ liệu cho các danh mục trên

Hãy giữ chúng như chúng đang ở đây. Tôi cũng sẽ áp dụng tỷ lệ MinMax với phạm vi 0-1

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
11

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
12

GIÁO DỤCKIDSDRIVHOMEKIDS01. 00. 00. 010. 00. 00. 0

Đối với các danh nghĩa là các tính năng nhị phân, bạn có thể để chúng dưới dạng một chỉ báo chuỗi đơn [e. g. Xe màu đỏ Có [1] hoặc Không [0]] hoặc tách chúng thành hai chuỗi được mã hóa một chiều loại trừ lẫn nhau [e. g RedCarYes và RedCarNo]. Đối với một số phương pháp như XGBoost, phương pháp thứ hai được ưu tiên

Dưới đây tôi đã viết một vòng lặp for giữ một chuỗi duy nhất cho các tính năng nhị phân và tạo các tính năng n chiều cho các tính năng danh nghĩa với giá trị n+2

Không cần chia tỷ lệ ở đây vì tất cả các giá trị đều là 0 hoặc 1

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
13

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
14

Bộ dữ liệu cuối cùng được sử dụng để phân cụm

Tôi sẽ tạo hai bản sao của dữ liệu

  1. sử dụng các phép biến đổi OHE ở trên và chia tỷ lệ tính năng [0,1]
  2. áp dụng các phép biến đổi trên nhưng không mở rộng tính năng. Lý do cho điều này là vì một số gói khoảng cách và phân cụm xử lý việc chuẩn bị cho bạn - nhưng thật tốt nếu bạn biết cách tự mình thực hiện

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
15

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
16

4. 2 Các phương pháp phân cụm cho các kiểu dữ liệu hỗn hợp

Trong phần này, một số thuật toán và cách tiếp cận phân cụm được áp dụng. Tuy nhiên, trước tiên, một số kỹ thuật đánh giá cụm chung được giới thiệu

kỹ thuật đánh giá

Biểu đồ khuỷu tay, Điểm bóng và Mẫu bóng

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
17

Để minh họa các kỹ thuật đánh giá, chúng tôi sẽ tạo một số cụm đơn giản bằng cách sử dụng sklearn

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
18

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
19

Để giúp đánh giá và xác định số cụm $k$ tối ưu trong một biểu đồ, có thể áp dụng các phương pháp sau

  • Kỹ thuật Elbow số liệu phân cụm. Chúng ta có thể trực tiếp sử dụng phép đo phân cụm để đánh giá kết quả phân cụm. Đối với phương tiện k, các cụm được tạo bằng cách giảm thiểu Intertia [xem 4. 2. 1 bên dưới]. Cái gọi là “kỹ thuật khuỷu tay” vẽ đồ thị quán tính và số cụm tối ưu $k$ được chọn làm điểm tại đó quán tính bị uốn cong. Biểu đồ bên trái bên dưới chỉ ra rằng các kẽ ngừng thay đổi đáng kể xung quanh $k=5$, số cụm thực sự

  • Là một biện pháp phân tách cụm và tương tự. Điểm kết hợp chênh lệch trung bình trong cụm và khoảng cách cụm gần nhất của từng mẫu. Với 1 là tốt nhất “tất cả các mẫu cụm đều giống nhau” và -1 là xấu nhất “các cụm không giống nhau và chồng chéo”. Trên thực tế, hàm sklearn

    # load data
    DATA_PATH = os.path.join[os.getcwd[],'../_data']
    raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]
    
    # convert numerical-object to numericals
    for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
        raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]
    
    # clean textual classes
    for col in raw.select_dtypes[include='object'].columns:
            raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
            
    data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
    
    20 có thể tính toán bất kỳ số liệu khoảng cách theo cặp nào từ sklearn hoặc
    # load data
    DATA_PATH = os.path.join[os.getcwd[],'../_data']
    raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]
    
    # convert numerical-object to numericals
    for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
        raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]
    
    # clean textual classes
    for col in raw.select_dtypes[include='object'].columns:
            raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
            
    data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
    
    21. Đối với KMeans, khoảng cách Euclide là điểm số mặc định nhưng chúng tôi cũng có thể sử dụng các chỉ số Tương quan, Manhattan, v.v. Đối với phương pháp Elbow, $k$ được chọn để tối ưu hóa chỉ số đã chọn

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
22

Việc chọn giá trị tối ưu cho $k$ cũng có thể được hỗ trợ bằng cách kiểm tra kỹ hơn bản thân các mẫu và cụm. Sklearn có một hướng dẫn hay. Bao gồm các

  • hiển thị điểm bóng trên mỗi điểm dữ liệu trong một cụm [trái]. Các thanh màu là các điểm dữ liệu trong mỗi cụm, trong đó chiều rộng là điểm bóng của điểm dữ liệu. Đường đứt nét dọc là điểm trung bình trên mỗi điểm dữ liệu trên tất cả các cụm. Chiều cao nhóm bard cụm cho biết kích thước của cụm. Các cụm và mẫu có biểu đồ hình bóng “nhiễu” về chiều rộng và chiều cao không bằng nhau cho thấy khả năng phân cụm kém

  • Trọng tâm cụm [phải]. Kèm theo các ô mẫu bóng, các cụm dữ liệu và trọng tâm được hiển thị rõ ràng

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
23

Đối với các ô phân tán. Nếu bạn có nhiều tính năng trong dữ liệu phân cụm của mình hoặc nếu không có ma trận khoảng cách, thì trước tiên bạn phải áp dụng kỹ thuật phân tách chẳng hạn như PCA, MCA hoặc t-SNE để thu được vectơ 2 hoặc 3 chiều để vẽ biểu đồ

LƯU Ý sử dụng t-SNE một cách thận trọng vì điều này làm thay đổi tỷ lệ và độ lớn của không gian đặc trưng và một số phương pháp, chẳng hạn như vẽ đồ thị trọng tâm, sẽ không hoạt động như hình bên dưới. Xem tại đây và tại đây để được giải thích và hướng dẫn sử dụng t-SNE

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
24

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
25

4. 2. 1 phương tiện K

Thuật toán KMeans cố gắng phân cụm dữ liệu bằng cách tạo các nhóm giảm thiểu sự khác biệt về tổng bình phương trong cụm, hay còn gọi là quán tính. Quán tính đo mức độ giống nhau của từng cặp điểm là khoảng cách Euclide giữa chúng, khoảng cách nhỏ hơn == độ tương đồng cao hơn. Thuật toán KMeans được tính theo 3 bước

  1. $k_n$ trọng tâm ngẫu nhiên ban đầu được chọn
  2. các điểm dữ liệu được gán cho trung tâm $k_i$ gần nhất của chúng
  3. trọng tâm mới được tạo làm vị trí trung bình của $k_i$ và các điểm được chỉ định của nó. Bước 2 và 3 được lặp lại trên các cetroid mới cho đến khi có rất ít hoặc không có thay đổi giữa các lần lặp lại

KMeans hoạt động tốt trên các tập dữ liệu lớn với các đặc điểm số, kích thước cụm đồng nhất và trong đó các cụm là "đốm màu" lồi và đẳng hướng. Để biết mô tả đầy đủ về KMeans và những hạn chế của nó, hãy xem

Đối với dữ liệu nhiều chiều [e. g. nhiều tính năng] và với các loại dữ liệu hỗn hợp, có khả năng cao là khoảng cách giữa các tia và khoảng cách Euclide trở nên không đáng kể do. Nói một cách đơn giản, trong không gian nhiều chiều và với các tính năng phân tán độc lập [i. e. không có tương quan] điển hình là khoảng cách theo cặp giữa bất kỳ và tất cả các điểm trở nên rất nhỏ. Đây cũng có thể là một vấn đề đối với tập dữ liệu của chúng tôi với các tính năng phân loại

Áp dụng KMeans cho tập dữ liệu được chia tỷ lệ của chúng tôi cho thấy có thể có nhiều cụm. Điều này có thể phản ánh một số cụm thực tế trong dữ liệu. Nhưng nó cũng có thể là một vật phẩm có các tính năng phân loại và số hỗn hợp và các hạn chế của KMeans do tính đa chiều của dữ liệu

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
26

Khi $k$ tăng quán tính và điểm bóng được cải thiện. Đơn giản là có quá nhiều $k$ để thực hiện việc lấy mẫu bóng và vẽ sơ đồ trọng tâm, tuy nhiên chúng ta có thể vẽ đồ thị này bằng cách sử dụng t-SNE để kiểm tra trực quan điều gì đang xảy ra. mặc dù thô thiển. Dường như có một mức độ phân tách tốt trong biểu đồ t-SNE nhưng cũng có một số đốm màu hỗn hợp lớn hơn

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
27

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
28

Đây là một vấn đề khác của học tập không giám sát - các cụm chính xác là gì? . Bạn sẽ phải áp dụng sự kết hợp giữa kiến ​​thức và chuyên môn về miền với kết quả phân cụm và diễn giải để rút ra những hiểu biết có ý nghĩa nhất từ ​​các cụm. Tại đây, bạn có thể sử dụng các phương pháp, thống kê chẩn đoán và trực quan hóa khác để giải thích và đánh giá các cụm của mình. Chúng có thể bao gồm

  • kiểm tra hiệp hội. tương quan, cramer’s V, kiểm định chi-square
  • vẽ đồ thị hộp và kiểm tra phân phối giữa các cụm
  • phân loại. xây dựng cây quyết định với $k$ làm mục tiêu và giải thích các cụm bằng cách sử dụng tầm quan trọng của tính năng và giá trị hình dạng

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
29

MVR_PTSYOJTIFCAR_AGE. THU NHẬP GIÁO DỤC TRẺ EM LÁI XE NHÀ TRẺ EM ý nghĩa trung bìnhvarmeantrung bìnhvarmeantrung bìnhvarmean. varmeanmedianvarmeanmedianvarmeanmedianvark01. 31192713. 42031911. 44858912. 07. 8349275. 3761474. 013. 9220185. 379681. 4. 668456e+080. 16513800. 1946990. 18348600. 2623170. 4403670. 00. 69317011. 70818514. 60025411. 86197412. 07. 3437865. 1565844. 017. 4753945. 476736. 7. 152335e+080. 23131700. 1784440. 18861200. 2535840. 4412810. 00. 554575

2 hàng × 42 cột

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
30

4. 2. 2 K-medoid

K-medoids tương tự như Kmeans, nhưng sử dụng một điểm dữ liệu thực tế “medoid” để tạo thành các cụm thay vì giá trị trung bình của vị trí dữ liệu “trọng tâm” trong một cụm. K-medoids cũng lấy các số liệu khoảng cách khác nhau cho Kmeans, bao gồm Manhattan và Minkowski phù hợp với các bộ dữ liệu kiểu dữ liệu hỗn hợp như của chúng tôi. Mặc dù điều này làm cho K-medoids trở nên mạnh mẽ hơn đối với các ngoại lệ và quy mô tính năng, nhưng điều này phải trả giá bằng việc tính toán bổ sung và do đó hiệu suất kém trên các bộ dữ liệu lớn và khi $k$ cao

K-medoids có một số cài đặt trong Python. PAM [phân vùng xung quanh medoids] là phổ biến và được triển khai trong cả pyclustering và scikit-learning-extra. Xem tại đây và Schubert, 2018 để biết tổng quan về triển khai thuật toán trong pyclustering. Một số liên kết hữu ích hơn được đưa ra dưới đây

  • PAM là một biến thể của K-medoids
  • PAM k-medoids tự xác định trong python
  • tài liệu k-medoids trong pyclustering

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
31

K-medoids có thể được tính toán bằng nhiều thước đo khoảng cách. Ở đây, khoảng cách Manhattan hoặc “khối phố” được sử dụng vì điều này cung cấp thước đo phù hợp khi có cả đặc điểm phân loại và số. Khoảng cách Manhattan được tính toán trên tập dữ liệu được chuyển đổi và chia tỷ lệ vì

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
32 không tự thực hiện chuyển đổi tính năng

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
33

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
34

01200. 0000005. 9606225. 92158215. 9606220. 0000006. 38231025. 9215826. 3823100. 000000

Lưu ý, trái ngược với scikit, cụm trả về pyclustering trong danh sách dài $n$ gồm các danh sách, trong đó $n=k$ và $list$[$n$][$i$] là vị trí chỉ mục từ ma trận khoảng cách đầu vào. Chúng được chuyển đổi sang định dạng mảng phẳng

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
35

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
36

4. 2. 3 CLARANS

CLARANS là viết tắt của Clustering Large Applications based on RANdomized Search. Có một bài viết hay về CLARANS tại đây. Tóm lại, CLARANS xây dựng dựa trên các phương pháp k-medoid và CLARA. Điểm khác biệt chính trong CLARANS là các trung tâm cụm “trọng tâm” hoặc “trung tâm” được xác định thông qua một số vòng lấy mẫu ngẫu nhiên có giới hạn và một số điểm lân cận có giới hạn. Điều quan trọng, việc lấy mẫu không chỉ giới hạn ở dữ liệu lân cận của trọng tâm mà có thể bao gồm bất kỳ điểm nào trong toàn bộ tập dữ liệu. Do đó tránh được sự phát triển của cực tiểu địa phương như trong CLARA. Bài báo của CLARANS trình bày chi tiết về phương pháp này và các phương pháp khác như k-medoids rất đáng để đọc Raymond 2002

Việc triển khai CLARANS trong pyclustering yêu cầu danh sách các danh sách làm tập dữ liệu đầu vào của nó. Do đó, chúng tôi chuyển đổi dữ liệu tính năng được chuyển đổi và chia tỷ lệ từ mảng có nhiều mảng thành danh sách. Các đầu vào khác như sau

  • Dữ liệu đầu vào được trình bày dưới dạng danh sách các điểm [đối tượng], mỗi điểm nên được biểu diễn bằng danh sách hoặc bộ
  • số_cụm. số lượng cụm nên được phân bổ
  • số cục bộ. số lượng cực tiểu địa phương thu được [số lần lặp lại để giải quyết vấn đề]
  • maxneighbor. số lượng hàng xóm tối đa được kiểm tra. Giá trị của maxneighbor càng cao, CLARANS càng gần K-Medoids và mỗi lần tìm kiếm cực tiểu cục bộ càng lâu

lưu ý rằng clarans. py sử dụng thước đo khoảng cách Euclide. Không có lý do chức năng nào hạn chế thuật toán CLARANS sử dụng khoảng cách Euclide và bên dưới tôi đã tạo một lớp tùy chỉnh cục bộ ________ 037 bằng cách sử dụng khoảng cách Manhattan

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
38

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
39

VÂNG. Đối với K-medoids, rõ ràng có điều gì đó không ổn ở đây. CLARANS được cho là hiệu quả của chúng tôi đang mài giũa mất 18 giờ để hoàn thành 1 lần lặp của ứng cử viên $k$

Để xác nhận rằng đây không phải là sự cố triển khai, dưới đây là quá trình chạy CLARANS trên dữ liệu tổng hợp có kích thước bằng nhau. Và mất ít hơn 60 giây để chạy

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
40

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
41

Như đã minh họa ở trên, K-means, K-medoids và CLARANS đều phù hợp với hình học phẳng. Đó là chúng phù hợp với các cụm tạo thành vỏ lồi. Các cụm hình học không phẳng bao gồm các hình dạng cổ điển như hình xoắn ốc, hình lưỡi liềm và vòng đồng tâm

Do các vấn đề và thiếu sót của các thuật toán này và khoảng cách Euclide trong các trường hợp suy luận cao, giờ đây chúng tôi sẽ áp dụng các phép đo khoảng cách thay thế và thuật toán phân cụm phù hợp với hình học không phẳng chiều cao. Điều này bao gồm các cách tiếp cận dựa trên thứ bậc, hoặc mật độ như HDBSCAN

4. 2. 4 Phân cụm theo thứ bậc kết tụ với Gower

Agglomerative Clustering là một thuật toán phân cụm theo thứ bậc. Trong phân cụm kết tụ, mỗi điểm dữ liệu ban đầu được coi là một cụm duy nhất, sau đó được hợp nhất lặp lại [kết tụ] cho đến khi tất cả các điểm dữ liệu tạo thành một cụm lớn. Số cụm tối ưu $k$ được tìm thấy bằng cách giảm thiểu khoảng cách điểm dữ liệu trong cụm và tối đa hóa khoảng cách giữa mỗi cụm duy nhất,

Như đã nêu trong phần 3. 3. 1, khoảng cách Gower là một số liệu kết hợp phù hợp với các tập dữ liệu có kiểu dữ liệu hỗn hợp. Gower được triển khai ở đây trong Gower Python. Đối với người dùng R có Gower R

Trước tiên, hãy xem nhanh gói

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
42

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
43

Gower có hai chức năng cốt lõi,

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
44 và
# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
45. Thật tiện lợi, theo gower cũng đi kèm với chức năng xử lý tính năng chuẩn hóa và chia tỷ lệ để chúng tôi có thể chuyển dữ liệu thô hoặc đã chuyển đổi và chia tỷ lệ của mình

Có thể sử dụng

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
44 để tìm các mục $n$ liên quan đến một hàng dữ liệu. TH có thể hữu ích để nhanh chóng tìm thấy khách hàng tương tự khách hàng hoặc để đưa ra đề xuất phim chẳng hạn. Dưới đây tôi chọn một hàng dữ liệu ngẫu nhiên và tìm tp 5 mục tương tự

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
47

Gower trả về các vị trí chỉ mục và độ tương tự

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
48

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
49

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
50

Đối với phân cụm tổng hợp,

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
45 được sử dụng để tính toán ma trận tương tự giữa tất cả các bản ghi trong tập dữ liệu

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
52

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
53

Việc tính toán toàn bộ ma trận có thể mất chút thời gian. Sau khi hoàn thành, Gower trả về ma trận khoảng cách đầy đủ

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
54

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
55

01200. 0000. 2060. 17710. 2060. 0000. 21020. 1770. 2100. 000

Chức năng này được sử dụng để thực hiện phân cụm tổng hợp phân cấp. Có một vài cân nhắc quan trọng ở đây

  • # load data
    DATA_PATH = os.path.join[os.getcwd[],'../_data']
    raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]
    
    # convert numerical-object to numericals
    for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
        raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]
    
    # clean textual classes
    for col in raw.select_dtypes[include='object'].columns:
            raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
            
    data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
    
    56 yêu cầu ma trận đặc 1D làm đầu vào. Chúng ta có thể sử dụng ________ 057 để biến đổi ma trận gower
  • Một số phương pháp
    # load data
    DATA_PATH = os.path.join[os.getcwd[],'../_data']
    raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]
    
    # convert numerical-object to numericals
    for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
        raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]
    
    # clean textual classes
    for col in raw.select_dtypes[include='object'].columns:
            raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
            
    data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
    
    56 chỉ có thể được áp dụng cho khoảng cách Euclide. “Các phương thức 'centroid', 'median' và 'ward' chỉ được xác định chính xác nếu sử dụng số liệu theo cặp Euclide. ” xem tài liệu để biết chi tiết

Trả về là một [$n-1$] bởi 4 ma trận $Z$. Tại lần lặp thứ $i$, các cụm có chỉ số $Z[i, 0]$ và $Z[i, 1]$ được kết hợp để tạo thành một cụm. Khoảng cách giữa các cụm $Z[i, 0]$ và $Z[i, 1]$ được cho bởi $Z[i, 2]$. Giá trị thứ tư $Z[i, 3]$ đại diện cho số lượng quan sát ban đầu trong cụm mới được tạo. Định dạng của $Z$ lúc đầu có thể hơi khó hiểu nhưng các câu trả lời về stackoverflow này [1,2] đưa ra lời giải thích hay

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
59

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
60

id1id2distn06036. 09801. 00. 0002. 012867. 08191. 00. 0002. 0

Trực quan hóa các cụm phân cấp bằng cách sử dụng một. Mỗi cấp độ và lá trong dendrogram đại diện cho một cụm. Hiển thị rõ ràng bản chất phân cấp của phân cụm kết tụ

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
61

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
62

Để tìm số cụm tối ưu, chúng ta lại có thể áp dụng tính điểm bóng. Đầu tiên, được áp dụng để tạo thành các cụm phẳng từ ma trận liên kết cụm phân cấp [$Z$]

Điểm bóng được tính bằng cách sử dụng

  • khoảng cách Gower được tính toán trước trong ma trận gower đầy đủ
  • sử dụng tương quan

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
63

Trực quan hóa điểm bóng và đồ thị cho thấy một kết quả thú vị. Vòng cụm mới này dường như có $k$ tối ưu vào khoảng 5, 10 và 35. Như đã xảy ra trước đây khi sử dụng Kmeans, điểm bóng được hiển thị để cải thiện khi $i$ vượt quá 100. Tuy nhiên, điểm tương quan không thay đổi và điều này một lần nữa cho thấy các nhóm nhỏ độc đáo

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
64

# load data
DATA_PATH = os.path.join[os.getcwd[],'../_data']
raw = pd.read_csv[os.path.join[DATA_PATH,'car_insurance_claim.csv'],low_memory=False,]

# convert numerical-object to numericals
for col in ['INCOME','HOME_VAL','BLUEBOOK','OLDCLAIM', 'CLM_AMT',]:
    raw[col] = raw[col].replace['[^.0-9]', '', regex=True,].astype[float].fillna[0.0]

# clean textual classes
for col in raw.select_dtypes[include='object'].columns:
        raw[col] = raw[col].str.upper[].replace['Z_','',regex=True].replace['[^A-Z]','',regex=True]
        
data_types = {f:t for f,t in zip[raw.columns,raw.dtypes]}
65

5. Phần kết luận

Bài đăng này đã cung cấp một cái nhìn tổng quan về các cân nhắc chính để phân cụm dữ liệu nhiều chiều và với các kiểu dữ liệu khác nhau. Từ chuẩn bị và chuyển đổi tính năng, số liệu khoảng cách, đến các kỹ thuật phân cụm và thuật toán khác nhau

Các vấn đề và thách thức chung bao gồm. lựa chọn các số liệu khoảng cách thích hợp phù hợp với bản chất của dữ liệu, tránh các vấn đề về độ thưa thớt và kích thước; . Mặc dù không đầy đủ, bài đăng này đã chỉ ra cách tiếp cận những thách thức này bằng nhiều kỹ thuật khác nhau

Các phương pháp bổ sung mà người ta cũng có thể thử bao gồm. phân tách, áp dụng thành phần chính và nhiều phân tích tương ứng cho dữ liệu để giảm kích thước;

Dữ liệu phân loại có thể được phân cụm không?

Về cơ bản, nó là một tập hợp các đối tượng dựa trên sự giống và khác nhau giữa chúng. Phân cụm KModes là một trong những thuật toán Máy học không giám sát được sử dụng để phân cụm các biến phân loại .

Tại sao khó xử lý dữ liệu phân loại để phân cụm?

Phân cụm dữ liệu phân loại khó hơn một chút so với phân cụm dữ liệu số do không có trật tự tự nhiên, tính đa chiều cao và sự tồn tại của phân cụm không gian con . Một cách tiếp cận để dễ dàng xử lý dữ liệu là chuyển đổi nó thành dạng số tương đương nhưng có những hạn chế riêng.

Python quản lý dữ liệu phân loại như thế nào?

Xử lý dữ liệu phân loại trong hướng dẫn Python .
Mã hóa dữ liệu phân loại
Thay thế giá trị
mã hóa nhãn
Mã hóa một lần nóng
mã hóa nhị phân
Mã hóa khác biệt ngược
Các tính năng khác

3 kỹ thuật phân cụm là gì?

Các loại phân cụm .
Phân cụm dựa trên Centroid
Phân cụm dựa trên mật độ
Phân cụm dựa trên phân phối
Phân cụm theo cấp bậc

Chủ Đề